1.初识Bash
首先编译一个简单的bash
vim hello.sh
使用vim编辑hello.sh ,输入如下代码并保存:
#!/bin/bash echo hello word
运行Bash脚本的方式:
# 使用shell来执行 $ sh hello.sh # 使用bash来执行 $ bash hello.sh
还可以让脚本本身就具有可执行权限,通过chmod
命令可以修改:
# 赋予脚本的所有者该执行权限,允许该用户执行该脚本 $ chmod u+x hello.sh # 执行命令,这将使用脚本第一行指定的shell来执行,如果指定shell不存在,将使用系统默认shell来执行 $ ./hello.sh
2.bash特殊符号
2.1 # 注释(#!除外)
#!是用于指定当前脚本的解释器,我们这里为bash
,且应该指明完整路径,所以为/bin/bash
#!/bin/bash echo "The # here does not begin a comment." echo ‘The # here does not begin a comment.‘ echo The \# here does not begin a comment. echo The # 这里开始一个注释 echo ${PATH#*:} # 参数替换,不是一个注释 echo $(( 2#101011 )) # 数制转换(使用二进制表示),不是一个注释
2.2 ;分号(使用分号(;)可以在同一行上写两个或两个以上的命令。)
#!/bin/bash echo hello; echo there filename=ttt.sh if [ -r "$filename" ]; then # 注意: "if"和"then"需要分隔 echo "File $filename exists."; cp $filename $filename.bak else echo "File $filename not found."; touch $filename fi; echo "File test complete."
2.3终止case选项(双分号)
#!/bin/bash varname=b case "$varname" in [a-z]) echo "abc";; [0-9]) echo "123";; esac
2.4点号 . 等价于 source
$ source test.sh Hello World $ . test.sh Hello World
2.5 引号
2.5.1 双引号(") "STRING" 将会阻止(解释)STRING中大部分特殊的字符
2.5.2 单引号(‘) ‘STRING‘ 将会阻止STRING中所有特殊字符的解释,这是一种比使用"更强烈的形式。
2.6斜线和反斜线
2.6.1 斜线(/) 文件名路径分隔符。分隔文件名不同的部分(如/home/bozo/projects/Makefile)。也可以用来作为除法算术操作符。
2.6.2 反斜线(\) 一种对单字符的引用机制。\X 将会“转义”字符X。这等价于"X",也等价于‘X‘。\ 通常用来转义双引号(")和单引号(‘),这样双引号和单引号就不会被解释成特殊含义了。
2.7反引号 (`)
$ cp `mkdir back` test.sh back $ ls
2.8 冒号(:)
2.8.1 空冒号 等价于“NOP”(no op,一个什么也不干的命令)。也可以被认为与shell的内建命令true作用相同。
#!/bin/bash while : do echo "endless loop" done
等价于:
#!/bin/bash while true do echo "endless loop" done
可以在 if/then 中作占位符:
#!/bin/bash condition=5 if [ $condition -gt 0 ] then : # 什么都不做,退出分支 else echo "$condition" fi
2.8.2 变量扩展/子串替换
2.8.2.1 在与>
重定向操作符结合使用时,将会把一个文件清空,但是并不会修改这个文件的权限。如果之前这个文件并不存在,那么就创建这个文件。
$ : > test.sh # 文件“test.sh”现在被清空了 # 与 cat /dev/null > test.sh 的作用相同 # 然而,这并不会产生一个新的进程, 因为“:”是一个内建命令
2.8.2.2 ":"还用来在 /etc/passwd
和 $PATH
变量中做分隔符.
$ echo $PATH /usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/sbin:/usr/sbin:/usr/games $
2.9 问号(?)
在一个双括号结构中,?
就是C语言的三元操作符
#!/bin/bash a=10 (( t=a<50?8:9 )) echo $t
2.10 美元符号($)
2.10.1 变量替换
#!/bin/bash var1=5 var2=23skidoo echo $var1 # 5 echo $var2 # 23skidoo