进入test目录,新建test.sh文件,写入内容保存:
[root@localhost test]# vi test.sh
[root@localhost test]# cat test.sh
echo "hello shell"
执行方式:
[root@localhost test]# ll test.sh
-rw-r--r--. 1 root root 19 4月 4 15:15 test.sh
[root@localhost test]# chmod +x test.sh #添加执行权限
[root@localhost test]# ll test.sh
-rwxr-xr-x. 1 root root 19 4月 4 15:15 test.sh
[root@localhost test]# ./test.sh #执行脚本
hello shell
也可以直接使用解释器:
[root@localhost test]# /bin/sh test.sh
hello shell
使用定义过的变量,只要变量名前面加美元符号即可:
[root@localhost test]# vi test.sh
[root@localhost test]# cat test.sh
name="jojo"
echo $name
[root@localhost test]# ./test.sh
jojo
readonly将变量定义为只读变量,不能修改:
[root@localhost test]# vi test.sh
[root@localhost test]# cat test.sh
name="jojo"
readonly name
name="dio"
[root@localhost test]# ./test.sh
./test.sh:行3: name: 只读变量 #不能运行
使用unset可以删除变量:
[root@localhost test]# vi test.sh
[root@localhost test]# cat test.sh
name="jojo"
unset name
echo $name
[root@localhost test]# ./test.sh
上述代码无任何输出,因为变量已被删除。
字符串可以使用单引号,可以使用双引号,也可以不用引号
单引号里任何字符都会原样输出,单引号字符串中变量无效;
单引号中不能出现一个单独的单引号,但可以出现成对单引号。
[root@localhost test]# vi test.sh
[root@localhost test]# cat test.sh
s=‘jojo'
echo $s
echo s
s1='dio'
s2='di'o'
s3='d'i'o'
echo $s1
echo $s2
echo $s3
[root@localhost test]# ./test.sh
dio
其他均无输出,只有拼接有。
直接输出:
[root@localhost test]# cat test.sh
echo 'jojo'
[root@localhost test]# ./test.sh
jojo
双引号里可以有变量
双引号可以出现转义字符
[root@localhost test]# cat test.sh
name="jojo"
s="hello "$name" !\n"
echo -e $s
[root@localhost test]# ./test.sh
hello jojo !
[root@localhost test]# cat test.sh
name="jojo"
#双引号拼接
s1="hello "$name" !"
echo $s1
#单引号拼接
s2='hey '$name'! '
echo $s2
[root@localhost test]# ./test.sh
hello jojo !
hey jojo!
[root@localhost test]# cat test.sh
s="heyshell"
echo "len :"
echo ${#s}
echo "subString :"
echo ${s:1:4}
echo "find subString:"
echo `expr index "$s" ey` #查找第一个出现e或y的位置
[root@localhost test]# ./test.sh
len :
8
subString :
eysh
find subString:
2
执行shell脚本时,向脚本传递参数,脚本内获取参数格式:$n 。n代表数字,1执行脚本的第一个参数,2为执行脚本的第二个参数,依次类推。
[root@localhost test]# cat test.sh
echo "执行文件名: $0";
echo "参数一 : $1 ";
echo "参数二 :$2 ";
echo "参数三 : $3 ";
[root@localhost test]# ./test.sh hello hey hola #传递参数
执行文件名: ./test.sh;
参数一 : hello ;
参数二 :hey ;
参数三 : hola ;
其他常用的参数:
[root@localhost test]# vi test.sh
[root@localhost test]# cat test.sh
echo "执行文件名: $0";
echo "参数一 : $1 ";
echo "参数个数: $#";
echo "传递参数作为字符串显示: $* ";
[root@localhost test]# ./test.sh hey jojo i am dio
执行文件名: ./test.sh;
参数一 : hey ;
参数个数: 5;
传递参数作为字符串显示: hey jojo i am dio ;
$*与$@的区别
相同:都引用了所有参数
不同:只有在双引号中体现出来。设脚本运行写了三个参数 1,2 ,3 ,则" *"等价于“1 2 3”
“@”等价于"1"“2”,“3”。
[root@localhost test]# cat test.sh
echo " \$*演示:"
for i in "$*";do
echo $i
done
echo " \$@演示:"
for i in "$@";do
echo $i
done
[root@localhost test]# ./test.sh hey jojo i am dio
$*演示:
hey jojo i am dio
$@演示:
hey
jojo
i
am
dio
数组可以存放多个值,Bash Shell只支持一维数组。初始化时不需要定义数组大小;
数组下标从0开始;
Shell数组用括号表示,元素使用“空格”符号分割开
[root@localhost test]# cat test.sh
arr=(a b c) #新建一个数组
echo "arr[0] :${arr[0]}" #数组元素
echo "arr[1] :${arr[1]}"
echo "arr[2] :${arr[2]}"
[root@localhost test]# ./test.sh
arr[0] :a
arr[1] :b
arr[2] :c
Bash支持关联数组,可以使用任意字符串或整数作为下标访问数组元素。
关联数组使用declare命令声明。
[root@localhost test]# cat test.sh
declare -A num=(["1"]="one" ["2"]="two" ["3"]="three")
echo ${num["1"]}
[root@localhost test]# ./test.sh
one
-A选项声明一个关联数组。
关联数组的键是唯一的。
获取数组中的所有元素,使用@或*可以获取数组中的元素。
[root@localhost test]# cat test.sh
declare -A num=(["1"]="one" ["2"]="two" ["3"]="three")
echo ”${num[*]}”
echo "${num[@]}"
[root@localhost test]# ./test.sh
”one two three”
one two three
数组前加!可以获得数组所有键值。
[root@localhost test]# cat test.sh
declare -A num=(["1"]="one" ["2"]="two" ["3"]="three")
echo ”${!num[*]}”
echo "${!num[@]}"
[root@localhost test]# ./test.sh
”1 2 3”
1 2 3
获取数组长度和获取字符串长度的方法相同。
[root@localhost test]# cat test.sh
declare -A num=(["1"]="one" ["2"]="two" ["3"]="three")
echo ”${#num[*]}”
echo "${#num[@]}"
[root@localhost test]# ./test.sh
”3”
3
原生bash不支持简单数学运算,但是可以使用其他命令来实现,例如awk,expr,expr最常用,使用它能够完成表达式的求值操作。
[root@localhost test]# cat test.sh
val=`expr 2 + 4`
echo "sum: $val "
[root@localhost test]# ./test.sh
sum: 6
[root@localhost test]# cat test.sh
a=1314
b=521
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 等于 b"
fi
if [ $a != $b ]
then
echo "a 不等于 b"
fi
执行:
[root@localhost test]# ./test.sh
a + b : 1835
a - b : 793
a * b : 684594
b / a : 0
b % a : 521
a 不等于 b
其他运算符:
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。
! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。
-o 或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a 与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。
&& 逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false
|| 逻辑的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true
a=“abc" b=“def”
= 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 检测两个字符串是否不相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。
-n 检测字符串长度是否不为 0,不为 0 返回 true。 [ -n "$a" ] 返回 true。
$ 检测字符串是否不为空,不为空返回 true。 [ $a ] 返回 true。