Shell变量\传递参数\数组\运算符

Shell变量\传递参数\数组\运算符

进入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 44 15:15 test.sh
[root@localhost test]# chmod +x test.sh #添加执行权限
[root@localhost test]# ll test.sh
-rwxr-xr-x. 1 root root 19 44 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

上述代码无任何输出,因为变量已被删除。

Shell字符串

字符串可以使用单引号,可以使用双引号,也可以不用引号

单引号

  • 单引号里任何字符都会原样输出,单引号字符串中变量无效;

  • 单引号中不能出现一个单独的单引号,但可以出现成对单引号。

[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 31 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。

你可能感兴趣的:(运维,Linux,bash,linux,centos)