声明变量java
a-zA-Z
开头,不包含特殊字符PATH="/user/yihui"
使用shell
{}
进行变量名的圈定readonly
修饰变量为不可更改unset
删除变量(且没法再次声明和使用,只读变量没法删除)PATH="/user/yihui" echo "the path is ${PATH}/tmp" PATH="/test" echo "after modify, the new path is ${PATH}/tmp" readonly PATH PATH="/new"
// 输出为: the path is /user/yihui/tmp after modify, the new path is /test/tmp ./in.sh: line 12: PATH: readonly variable
特殊变量数组
Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数函数
$$
表示当前Shell进程的ID,即pid$0
当前的脚本名$#
传递给脚本或函数的参数个数。$n
传递给脚本或函数的参数。n是一个数字,表示第几个参数,例如,第一个参数是$1
,第二个参数是$2
$?
上个命令的退出状态,或函数的返回值$*
传递给脚本或函数的全部参数$@
传递给脚本或函数的全部参数, 与$*
区别在于被双引号(" ")包含时,"$*" 会将全部的参数做为一个总体,以"$1 $2 … $n"
的形式输出全部参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n"
的形式输出全部参数echo "current pid:$$" echo "arg num: $#" echo "shell name: $0" echo "second arg: $2" echo "last return $?" for var in $*: do echo "$var" done echo "\$*=" $* echo "\$*=$*" for var in $@: do echo "$var" done echo "\$*=" $@ echo "\$@=$@"
current pid:36886 arg num: 4 shell name: ./in.sh second arg: hello last return 0 test hello wolrd 123: $*= test hello wolrd 123 $*=test hello wolrd 123 test hello wolrd 123: $*= test hello wolrd 123 $@=test hello wolrd 123
命令替换测试
限制性shell命令,并将结果保存在变量之中ui
用反引号,将shell命令包含起来便可命令行
Data=`date` echo "data is $Data" UNUM=`who | wc -l` echo "current user num: $UNUM"
data is 2017年 5月21日 星期日 14时54分19秒 CST current user num: 2
变量替换code
上面使用
${varName}
来表示变量,放在双引号中时,会自动被值替换,下面给出一些扩展进程
${var:-word}
若是变量 var 为空或已被删除(unset),那么返回 word,但不改变 var 的值${var:=word}
若是变量 var 为空或已被删除(unset),那么返回 word,并将 var 的值设置为 word${var:?message}
若是变量 var 为空或已被删除(unset),那么将消息 message 送到标准错误输出,能够用来检测变量 var 是否能够被正常赋值。 若此替换出如今Shell脚本中,那么脚本将中止运行${var:+word}
若是变量 var 被定义,那么返回 word,但不改变 var 的值数学运算字符串
使用 expr xxx
expr $a + $b
表示两数相加数学判断
布尔运算
注意
条件表达式要放在方括号之间,而且要有空格,例如 [$a==$b] 是错误的,必须写成 [ $a == $b ]
#!/bin/sh a=10 b=20 val=`expr $a + $b` echo "a + b : $val" val=`expr $a - $b` echo "a - b : $val" val=`expr $a \* $b` echo "a * b : $val" val=`expr $b / $a` echo "b / a : $val" val=`expr $b % $a` echo "b % a : $val" if [ $a == $b ] then echo "a is equal to b" fi if [ $a != $b ] then echo "a is not equal to b" fi
输出
a + b : 30 a - b : -10 a * b : 200 b / a : 2 b % a : 0 a is not equal to b
字符串运算
${#varName}
${arName:1:4}
a="hello" b="world" if [ $a = $b ];then echo "a equal b" elif [ $a != $b ];then echo "a not equal b" fi if [ $a ];then echo "$a is not blank" fi if [ -n $a ];then echo "$a's length bigger then 0" fi echo "$a's length ${#a}" echo "$a index of 1, 4 is ${a:1:4}"
a not equal b hello is not blank hello's length bigger then 0 hello's length 5 hello index of 1, 4 is ello
声明
ary=(value1 value2 value3)
读取
第0个元素: ${ary[0]}
全部元素: $ary[*]
$ary[@]
长度 : ${#ary[*]}
ary=('hello' 'world' 'java' 'shell') echo $ary echo ${ary[1]} echo "all cell is : ${ary[*]}" echo "length ${#ary[*]}"
hello world all cell is : hello world java shell length 4
if语句
语法:
if [ condition ]; then xxx elif [ condition ]; then xxx else xxx fi
switch语句
语法:
case value in: v1) xxx xxx ;; v2) xxx xxx ;; *) xxx ;;; esac
测试
ary=('hello' 'world' 'java' 'shell') if [ ${ary[0]} = 'helo' ];then echo "first cell is helo" elif [ ${ary[0]} = 'hello' ];then echo "first cell is hello" else echo "default" fi read option case $option in ${ary[0]}): echo "print hello" ;; ${ary[1]}): echo "print world" ;; ${ary[2]}): echo "print java" ;; ${ary[3]}): echo "print shell" ;; *): echo "print other" ;; esac
输出
first cell is hello java <-- 这个是本身输入的 print java
for循环
语法
for 变量 in 列表: do xxx done for ((i=0;i<$#;i++)): do xxx done
ary=('hello' 'world' 'java' 'shell') for i in ${ary[*]} do echo $i done for ((i=0;i<10;i++)) do printf "%d %s" $i ' ' done
输出
hello world java shell 0 1 2 3 4 5 6 7 8 9
while循环
语法
while condition do xxx done
COUNTER=0 while [ $COUNTER -lt 5 ] do COUNTER='expr $COUNTER+1' echo $COUNTER done
until循环
循环执行,直到条件为true时中止,语法同while
ary=('hello' 'world' 'java' 'shell') i=0 until [ ${ary[$i]} = 'world' ] do i=`expr $i + 1` echo $i done
1
break, continue
循环的控制
前面加一个点号, 引入文件,则能够直接访问文件中的变量
. fileName