shell特殊变量,分别是:$#、$*、$@、$?、$$
$0:当前脚本的文件名。 $n(n≥1):传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 $1,第二个参数是 $2。 $#:传递给脚本或函数的参数个数。 $*:传递给脚本或函数的所有参数。 $@:传递给脚本或函数的所有参数。当被双引号" "包含时,$@ 与 $* 稍有不同,"$*"会将所有的参数从整体上看做一份数据;"$*"会将所有的参数从整体上看做一份数据。 $?:上个命令的退出状态,或函数的返回值。 $$:当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。
shell脚本获取命令行参数:getopts方式
while getopts ":a:b:c:" opt do case $opt in a) echo "参数a的值$OPTARG" ;; b) echo "参数b的值$OPTARG" ;; c) echo "参数c的值$OPTARG" ;; ?) echo "未知参数" exit 1;; esac done
结果如下:
$ ./test.sh -a 1 -b 2 -c 3 #在shell中的输出 参数a的值1 参数b的值2 参数c的值3
字符串:可以由单引号' '
包围,也可以由双引号" "
包围,也可以不用引号
1) 由单引号' '
包围的字符串:
- 任何字符都会原样输出,在其中使用变量是无效的。
- 字符串中不能出现单引号,即使对单引号进行转义也不行。
2) 由双引号" "
包围的字符串:
- 如果其中包含了某个变量,那么该变量会被解析(得到该变量的值),而不是原样输出。
- 字符串中可以出现双引号,只要它被转义了就行。
3) 不被引号包围的字符串
- 不被引号包围的字符串中出现变量时也会被解析,这一点和双引号
" "
包围的字符串一样。 - 字符串中不能出现空格,否则空格后边的字符串会作为其他变量或者命令解析。
获取字符串长度
string_name=abcd
echo ${#string_name}
字符串截取
从指定位置开始截取
这种方式需要两个参数:除了指定起始位置,还需要截取长度,才能最终确定要截取的字符串。
1) 从字符串左边开始计数
${string: start :length} #string 是要截取的字符串,start 是起始位置(从左边开始,从 0 开始计数),length 是要截取的长度(省略的话表示直到字符串的末尾)。
2) 从右边开始计数
${string: 0-start :length} #同第 1) 种格式相比,第 2) 种格式仅仅多了0-,这是固定的写法,专门用来表示从字符串右边开始计数。
从指定字符(子字符串)开始截取
这种截取方式无法指定字符串长度,只能从指定字符(子字符串)截取到字符串末尾。Shell 可以截取指定字符(子字符串)右边的所有字符,也可以截取左边的所有字符。
1) 使用 # 号截取右边字符
${string#*chars} #string 表示要截取的字符,chars 是指定的字符(或者子字符串),*是通配符的一种,表示任意长度的字符串。*chars连起来使用的意思是:忽略左边的所有字符,直到遇见 chars(chars 不会被截取)。
${string##*chars} #直到最后一个指定字符(子字符串)再匹配结束
2) 使用 % 截取左边字符
${string%chars*} #使用%号可以截取指定字符(或者子字符串)左边的所有字符
字符串替换
string=abc12342341
echo ${string/23/bb} #abc1bb42341 替换一次
echo ${string//23/bb} #abc1bb4bb41 双斜杠替换所有匹配
echo ${string/#abc/bb} #bb12342341 #以什么开头来匹配,根php中的^有点像
echo ${string/%41/bb} #abc123423bb %以什么结尾来匹配,根php中的$有点像
数组
#数组定义 arr=(1 2 3) arr2=() #空数组 #字符串转数组 str=1,2,3,4 arr3=(${str//,/ }) #获取数组长度 echo ${#arr[*]} 或 echo ${#arr[@]} #查看数组所有数据 echo ${arr[*]} 或 echo ${arr[@]}
#数组动态追加元素
arr[${#arr[*]}]=追加的元素
#数组拼接:先利用@
或*
,将数组扩展成列表,然后再合并到一起。
array_new=(${array1[@]} ${array2[@]})
#删除数组
unset array_name
#删除数组指定下标数据
unset array_name[index]
关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举例 |
---|---|---|
-eq | 检测两个数是否相等,相等返回 true。 | [ $a -eq $b ] 返回 false。 |
-ne | 检测两个数是否不相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true。 | [ $a -gt $b ] 返回 false。 |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true。 | [ $a -lt $b ] 返回 true。 |
-ge | 检测左边的数是否大于等于右边的,如果是,则返回 true。 | [ $a -ge $b ] 返回 false。 |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 | [ $a -le $b ] 返回 true。 |
函数定义、调用和返回值
function sum(){ val1=$1 #函数第一个参数 val2=$2 #函数第二个参数 val3=$(($1+$2)) echo $val3 } #Call function with 2 parameters and it return 1 parameter. ret_val=$(sum 10 20) echo $ret_val
查询数据库数据并处理结果集
HOSTNAME="172.16.xx.xx" #数据库信息 PORT="3306" USERNAME="root" PASSWORD="root" DBNAME="log" #数据库名称 TABLENAME="student" COMMAND1="mysql -h${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} ${DBNAME} 方法一: while read -a row do echo "..${row[0]}..${row[1]}.." done< <(echo "select id ,name from student;" | ${COMMAND1}) 方法二: while read a b do echo "..${a}..${b}.." done< <(echo "select id ,name from student;" | ${COMMAND1}) 注释:注意"done< <("的写法,第一个"<"要和"done"之间没空格,两个"<"之间有一个空格,"<" 和"("之间没空格。
比较运算符
-eq //等于 -ne //不等于 -gt //大于 (greater ) -lt //小于 (less) -ge //大于等于 -le //小于等于
for循环
for item in (1 2 3) do echo $item done
if条件判断
test命令,对特定条件进行测试,并使用$?
对返回值进行判断
test 条件表达式
&
[ 条件表达式 ] //更为常用
注意: 中括号“[”和“]”与条件表达式之间均需要使用空格隔开,否则会出现错误!!