- 定义变量
变量名和等号之间不能有空格###
varName="value"
-
使用变量:
$+变量名
echo $varName;
echo ${your_name}
{}可选,好处是为了解释器识别变量的边界; -
只读变量
readonly varName -
删除变量
unset varName -
特殊变量:
$0 $n $# $* $@ $? $$
$* 和 $@ 的区别
$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。
但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。
-
命令替换
shell 先执行命令,将输出结果保存,在适当的时候输出;
`command个人理解,就是把计算结果保存在一个临时变量中 比如: date=\
DATE`
echo "date is $date" -
变量替换
${var} | 原来的值
-------|---------
${var:-word}|如果变量 var 为空或已被删除(unset),那么返回 word,但不改变 var 的值。
${var:=word}| 如果变量 var 为空或已被删除(unset),那么返回 word,并将 var 的值设置为 word。
${var:+word}|如果变量 var 被定义,那么返回 word,但不改变 var 的值。
${var:?message}|如果变量 var 为空或已被删除(unset),那么将消息 message 送到标准错误输出,可以用来检测变量 var 是否可以被正常赋值。
若此替换出现在Shell脚本中,那么脚本将停止运行 -
shell 运算符
运算符 两边记得一定要留空格,否则会整体当做一个字符串输出
表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2
乘法 * 必须添加\转义才能实现乘法运算
echoexpr 2 \* 4
运算符 | 说明 | 举例 |
---|---|---|
-eq | is equal to | [ $a -eq $b ] |
-ne | is notequal to | [ $a -ne $b ] |
-gt | is greater than | [ $a -gt $b ] |
-lt | is less than | [ $a -lt $b ] |
-ge | is greater or equal | [ $a -ge $b ] |
-le | is less or equal | [ $a -le $b ] |
! | 非运算符 | [!false] |
-o | or | [ $a -lt 20 -o $b -gt 100 ] |
-a | and | [ $a -lt 20 -a $b -gt 100 ] |
-z | 检测字符串长度是否是zero 为0 返回true | [ -z $a ] |
-n | 检测字符串长度是否是zero 不为0返回true | [ -n $a ] |
-r | 检测文件 has read access | [ -r $file ] |
-w | 检测文件has write permission | [ - w $file ] |
-x | 检测文件has execute permission | [ -x $file ] |
-f | file is an ordinary file | [ -f $file ] |
-d | file is a directory | [ -d $file ] |
-s | file size is zero | [ -s $file ] |
-e | file exists | [ -e $file ] |
- 只有单行注释 用#
- 单引号,双引号字符串
单引号字符串的限制:
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
双引号的优点:
双引号里可以有变量
双引号里可以出现转义字符
youname="ffc"
grren="hello, "$youname" "
gren3="hello,${youname}"
获取字符串长度:
string="abcd"
echo ${#string}
提取子字符串:
echo ${string:1:4}
查找字符串:
echoexpr index "$string" is
- 数组:()包括,空格分割
array=(v1 v2 v3)
读取数组 ${array[2]}
读取所有元素: ${array[]} ${array[@]}
获取数组长度:${#array[@]} ${#array[]} ${#array[n]} - 输出字符串 echo
printf 不加括号 可以用单双引号, 参数用空格分割; - shell if 语句
if ... fi 语句;
if ... else ... fi 语句;
if ... elif ... else ... fi 语句。
a=10
b=20
if [ $a == $b ]
then
echo "a is equal to b"
elif [ $a -gt $b ]
then
echo "a is greater than b"
elif [ $a -lt $b ]
then
echo "a is less than b"
else
echo "None of the condition met"
fi
- case 模式
read aNum
case $aNum in- echo "go one "
;;
- echo "go one "
- echo "you select 2"
;;
*) echo "donn't find"
;;
esac
echo 'Input a number between 1 to 4'
echo 'Your number is:\c'
read aNum
case $aNum in
1) echo 'You select 1'
;;
2) echo 'You select 2'
;;
3) echo 'You select 3'
;;
4) echo 'You select 4'
;;
*) echo 'You do not select a number between 1 to 4'
;;
esac
- for循环一般格式为:
for 变量 in 列表
do
command1
command2
...
commandN
done
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
- while 循环 运算符两边一定留空格
counter=0
while [ $counter -lt 5 ]
do
counter=`expr $counter + 1`
echo $counter
done
- until 循环执行一系列命令直至条件为 true 时停止
#!/bin/bash
a=0
until [ ! $a -lt 10 ]
do
echo $a
a=`expr $a + 1`
done
- break 跳出所有循环 break n 嵌套循环中跳出几级循环
continue 跳出当前循环 - 函数
#!/bin/bash
funWithReturn(){
echo "The function is to get the sum of two numbers..."
echo -n "Input first number: "
read aNum
echo -n "Input another number: "
read anotherNum
echo "The two numbers are $aNum and $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
# Capture value returnd by last command
ret=$?
echo "The sum of two numbers is $ret !"
删除变量:
unset -f function_name
#!/bin/bash
funWithParam(){
echo "The value of the first parameter is $1 !"
echo "The value of the second parameter is $2 !"
echo "The value of the tenth parameter is $10 !"
echo "The value of the tenth parameter is ${10} !"
echo "The value of the eleventh parameter is ${11} !"
echo "The amount of the parameters is $# !" # 参数个数
echo "The string of the parameters is $* !" # 传递给函数的所有参数
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
- 标准输入设备就是键盘 ,标准输出设备就是显示器;
输出重定向:
command > file
追加不覆盖 command >>file - 引用其他文件:
. sourcefile
source filename
一般使用点号(.),但是注意点号(.)和文件名中间有一空格。
网友评论