shell脚本语法学习:
1、变量命名规则:
/**
*变量名由数字、字母、下划线组成;
*必须以字母或者下划线开头;
*不能使用 Shell 里的关键字(通过 help 命令可以查看保留关键字)
*如 param[合格] 12param[报错]
*/
2、获取变量时最好用${变量名}
/**
* 如:param="123" 变量赋值时,变量名不能与等号空格隔开
* echo $param 或者 echo ${param}变量获取值时,变量名不能与等号空格隔开
* variable=`commond` 或者 variable=$(commond) 将命令赋值
* readonly param 自动变量,不能重新赋值
* unset param 删除变量
* 变量类型可分为局部、环境、shell变量
*/
3、特殊变量列表、变量、含义
/**
*$0 当前脚本的文件名
*$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数
*$# 传递给脚本或函数的参数个数。
*$* 传递给脚本或函数的所有参数。
*$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时——换行,与 $* 稍有不同——不换行
*$? 上个命令的退出状态,或函数的返回值。
*$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
*如 ./test.sh param1 param2 test.sh的内容为echo "This is First param:$1"
*打印 This is First param:param1
*/
4、转义字符和含义
/**
*\\ 反斜杠
*\a 警报,响铃
*\b 退格(删除键)
*\f 换页(FF),将当前位置移到下页开头
*\n 换行
*\r 回车
*\t 水平制表符(tab键)
*\v 垂直制表符
*如 echo -e "hello\nworld" 若去掉[-e]则无法换行
*注:echo 命令的[-E]禁止转义,默认也是不转义;[-n]可以禁止插入换行符。
*/
5、awk、expr[常用]支持表达式计算命令
/**
*如 echo `expr 2 + 2` 或者 echo $(2 + 2) 表达式运算中变量和运算符需空格隔开
*
*关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
*注:运算符和C语言一样
*
*布尔运算符
*! 非运算,表达式为 true 则返回 false,否则返回 true。
*-o 或运算,有一个表达式为 true 则返回 true。
*a 与运算,两个表达式都为 true 才返回 true。
*如 if [ $a -lt 20 -o $b -gt 40 ] 若then与if在同一行则需加';'
* then 如if [ $a -lt 20 -o $b -gt 40 ];then
* echo "hello"
* fi
*/
6、字符串运算
/**= 检测两个字符串是否相等,相等返回 true。
*!= 检测两个字符串是否相等,不相等返回 true。
*-z 检测字符串长度是否为0,为0返回 true。
*-n 检测字符串长度是否为0,不为0返回 true。
*str 检测字符串是否为空,不为空返回 true。
*如:if [ "abc" = "abc" ] 若then与if在同一行则需加';'
* then 如if [ "abc" = "abc" ];then
* echo "abc and abc are equal"
* fi
*/
7、文件检测
/**
*-b file 检测文件是否是块设备文件,如果是,则返回 true。
*-c file 检测文件是否是字符设备文件,如果是,则返回 true。
*-d file 检测文件是否是目录,如果是,则返回 true。
*-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。
*-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。
*-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。
*-p file 检测文件是否是具名管道,如果是,则返回 true。
*-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。
*-r file 检测文件是否可读,如果是,则返回 true。
*-w file 检测文件是否可写,如果是,则返回 true。
*-x file 检测文件是否可执行,如果是,则返回 true。
*-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。
*-e file 检测文件(包括目录)是否存在,如果是,则返回 true。
*如 file="/etc/passwd"
* if [ -r $file ] 若then与if在同一行则需加';'
* then 如if [ -r $file ];then
* echo "File has read access"
* fi
*/
8、字符串获取方式
/**
*如 str="ad"
*echo ${#str} 获取字符的长度
*echo ${str:1:2} 提取字符子串
*echo "hello "$str"!" 拼接字符串
*echo $(index "$str" d) 查找子字符串
*/
9、数组获取方式
/**
*语法格式如下:${array_name[index]}
*如 array_name=(1 2 3)
*echo ${array_name[0]} 获取第一个元素值
*echo ${array_name[*]} 或 echo ${array_name[@]} 获取所有元素值
*echo ${#array_name[*]} 或 echo ${#array_name[@]} 获取元素的长度
*或 echo ${#array_name[n]} 获取单个元素的长度
*注:数组获取形式以及下标和C语言一样
*/
10、printf函数的用法
/**
*语法格式如下:printf format-string[获取格式] arguments...[参数列表]
*printf 命令不用加括号
*format-string 可以没有引号,但最好加上,单引号双引号均可。
*参数多于格式控制符(%)时,无对应的控制符%参数则会重用format-string
*arguments 使用空格分隔,不用逗号。
*如 printf "%d %s\n" 5 "abc"
* printf "This is %s" abc def 输出This is abcThis is def
*/
11、if else分支用法
/**
*语法格式如下:
*if [ expression ] then ... fi
*if [ expression ] then ... else ... fi
*if [ expression ] then ... elif [ expression ] then ... else ... fi
*如 if [ '123' = '123' ] 若then与if在同一行则需加';'
* then 如if [ '123' = '123' ];then
* echo '123 and 123 are equal'
* fi
*或
* if test '123' = '123' ; then 可以用test命令替代中括号
*注:expression 和中括号([ ])之间必须有空格,否则会有语法错误。
*/
12、for循环用法
/**
*语法格式1如下:
*for param[变量取值] in list[参数列表——数值|字符串|文件路径]
*do
* command
* ...
*done
*如
*for FILE in $HOME/.bash* Linux自带的变量[set或env命令可查看所有变量]
*do
* echo $FILE
*done
*语法格式2如下:
*for ((i=1;i<n;i++))
*do
* echo ${i}
*done
*/
13、while循环用法
/**
*语法格式如下:
*while [ expression ]
*do
* command
* ...
*done
*如
*while [ 3 -lt 5 ] 可以用test命令替代中括号
*do
* echo "Yes" 进入到死循环
*done
*/
14、until循环用法
/**
*语法格式如下:
*until [ expression ] 正好与if、while相反,判断为真时退出循环
*do
* command
* ...
*done
*如
*until [ 3 -lt 5 ] 可以用test命令替代中括号
*do
* echo "Yes"
*done
*/
15、test命令用法
/**
*test 命令用于检查数值、字符和文件条件是否成立
*数值测试:
*-eq 等于则为真
*-ne 不等于则为真
*-gt 大于则为真
*-ge 大于等于则为真
*-lt 小于则为真
*-le 小于等于则为真
*如 if test 1 -lt 5 结果为真
*
*字符串测试
*= 等于则为真
*!= 不相等则为真
*-z 字符串 字符串长度伪则为真
*-n 字符串 字符串长度不伪则为真
*如 if test "a" = "a" 结果为真
*
*文件测试
*-e 文件名 如果文件存在则为真
*-r 文件名 如果文件存在且可读则为真
*-w 文件名 如果文件存在且可写则为真
*-x 文件名 如果文件存在且可执行则为真
*-s 文件名 如果文件存在且至少有一个字符则为真
*-d 文件名 如果文件存在且为目录则为真
*-f 文件名 如果文件存在且为普通文件则为真
*-c 文件名 如果文件存在且为字符型特殊文件则为真
*-b 文件名 如果文件存在且为块特殊文件则为真
*如 if test -r "/etc/passwd" 结果为真
*/
16、break和continue的用法
/**
*break命令允许跳出所有循环(终止执行后面的所有循环)。
*若break后面有参数n则表示跳出第几层循环
*如 for var1 in 1 2 3
* do
* echo "test exist${var}"
* for var2 in 0 5
* do
* if test ${var1} -eq 2 -a ${var2} -eq 0
* then
* break 1
* else
* echo "${var1} ${var2}"
* fi
* done
* done
*
*continue命令跳出当前循环
*若continue后面有参数n则表示跳出第几层循环
*/
17、函数用法
/**
*语法格式如下:
*[function] function_name () {
* ......
* [ return int; ] 返回值的范围[0,255]之间
* }
*如 output(){
* return "1"
* }
* output
* echo "$?" $?返回上个退出命令或调用函数的返回值
*注:调用函数可以在后面添加参数
*如 output(){
* echo "the param is $num"
* return "1"
* }
* read num #输入字符
* output $num #后面附带参数
* echo "$?" $?返回上个退出命令或调用函数的返回值
*$unset .f function_name 删除函数名
*
*调用另一个脚本的函数——文件包含
*方法一: . ./subscript.sh 其中./表示当前目录
*方法二: source ./subscript.sh
*注:1、两个点之间,用空格隔开
* 2、两个脚本不在同一目录,要用绝对路径
*如 . ./test.sh 或 source ./test.sh
* echo `output 2`
*/
18、输入输出重定向
/**
*语法格式如下:
*command > file 将输出重定向到 file。
*command < file 将输入重定向到 file。
*command >> file 将输出以追加的方式重定向到 file。
*n > file 将文件描述符为 n 的文件重定向到 file。
*n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。
*n >& m 将输出文件 m 和 n 合并。
*n <& m 将输入文件 m 和 n 合并。
*<< tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。
*如
* echo 'this is output content to file' > test.sh
*test.sh文件内容就替换成this is output content to file
*
*注:文件描述符0通常是标准输入(STDIN)1是标准输出(STDOUT) 2是标准错误输出(STDERR)
*/dev/null 文件可以理解为黑洞即垃圾回收站
*如
*command > /dev/null 2>&1 屏蔽stdout和stderr——禁止输出
*/
19、vi编辑命令
/**
*h 将光标向左移动 $ 移动到当前行末尾
*j、+、Enter 将光标向下移动 :n 移动到行n
*k、- 将光标向上移动 x 删除光标当前位置的字符
*l 将光标向右移动 dd 删除光标所在的整行文本
*} 将光标移动到当前段落的末尾 d$ 删除当前光标位置到该行结束的所以文本
*{ 将光标移动到当前段落的开头 dw 从当前光标位置向前删除单词
*) 将光标移动到当前句子的末尾 J 将下一行文本内容合并到本行行尾
*( 将光标移动到当前句子的开头 a 在当前光标位置后附加内容
*^ 移动到当前行的第一个非空字符 A 在当前光标所在行的后面附加内容
*/
参照链接:
http://c.biancheng.net/cpp/shell/
注:这是整理过后的笔记,接下来的其它语法后面会加以补充