shell基础(传递参数、数组、运算符、echo命令)

学习目标:

Linux速成八、


学习内容:

1、shell传递参数
2、shell数组
3、shell运算符
4、shell echo命令


1、shell参数传递

  • 向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
  • 参数:
 $# : 传递到脚本的参数个数     
 $* : 以一个单字符串显示所有向脚本传递的参数,如"$*"用「"」括起来的情况、以"$1 $2$n"的形式输出所有参数     
 $$ : 脚本运行的当前进程ID号     
 $! : 后台运行的最后一个进程的ID号     
 $@ :与$*相同,但是使用时加引号,并在引号中返回每个参数,如"$@"用「"」括起来的情况、以"$1" "$2""$n": 的形式输出所有参数
 $- : 显示Shell使用的当前选项,与set命令功能相同
 $? : 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误
  • 例题:
    1、向yyt.sh文件提交三个参数,执行程序时需要为脚本程序设置执行权限
#!/bin/bash
echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";

结果:

[root@localhost project]# ./yyt.sh 9 9 8
Shell 传递参数实例!
执行的文件名:./yyt.sh
第一个参数为:9
第二个参数为:9
第三个参数为:8

2、显示每个参数和个数以及第三个参数

#!/bin/bash
echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第三个参数为:$3";
echo "参数个数为:$#";
echo "参数分别为:$*";

结果:

[root@localhost project]# ./yyt.sh 4 5 6
Shell 传递参数实例!
执行的文件名:./yyt.sh
第三个参数为:6
参数个数为:3
参数分别为:4 5 6

3、此处演示$* 与 $@ 区别:

eg:显示{
     1 2 3},$*显示为"1 2 3",而$@显示为"1" "2" "3"
[root@localhost project]# cat yyt.sh 
#!/bin/bash
echo "__ \$* 演示 __"
for i in "$*";
do
  echo $i
  done
[root@localhost project]# ./yyt.sh 1 2 3
__ $* 演示 __
1 2 3
echo "__ \$@ 演示 __"
for i in "$@";
do
  echo $i
  done
[root@localhost project]# ./yyt.sh 1 2 3
__ $@ 演示 __
1
2
3

2、shell数组

  • 数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP类似),与大部分编程语言类似,数组元素的下标由0开始,Shell 数组用括号来表示,元素用"空格"符号分割开
  • 例题:定义数组1-5,并按要求读出
    首先定义数组:
 arry=(1 2 3 4 5)
 或者
 arry[0]=1
 arry[1]=2
 arry[2]=3
 arry[3]=4
 arry[4]=5

按要求读出数组:

将数组中的内容挨个输出
#!/bin/bash
arry=(1 2 3 4 5)
echo "第一个元素为:${arry[0]}"
echo "第二个元素为:${arry[1]}"
echo "第三个元素为:${arry[2]}"
echo "第四个元素为:${arry[3]}"
echo "第五个元素为:${arry[4]}"
[root@localhost project]# ./yyt.sh
第一个元素为:1
第二个元素为:2
第三个元素为:3
第四个元素为:4
第五个元素为:5
使用@ 或 * 可以获取数组中的所有元素
#!/bin/bash
arry=(1 2 3 4 5)
echo "数组元素为:${arry[*]}"
[root@localhost project]# ./yyt.sh
数组元素为:1 2 3 4 5
或者
#!/bin/bash
arry[0]=1
arry[1]=2
arry[2]=3
arry[3]=4
arry[4]=5
echo "数组元素为:${arry[@]}"
[root@localhost project]# ./yyt.sh 
数组元素为:1 2 3 4 5
输出拥有元素的个数
#!/bin/bash
arry[0]=1
arry[1]=2
arry[2]=3
arry[3]=4
arry[4]=5
echo "数组元素个数为:${#arry[@]}" / echo "数组元素个数为:${#arry=[*]}"
[root@localhost project]# ./yyt.sh 
数组元素个数为:5

3、shell运算符

  • Shell 和其他编程语言一样,支持多种运算符,包括:算数运算符、关系运算符、布尔运算符、字符串运算符、文件测试运算符
  • expr 是一款表达式计算工具,使用它能完成表达式的求值操作,表达式和运算符之间要有空格
#!/bin/bash
val=`expr 2 + 2`
echo "两数之和为 : $val"
  • 算数运算符:
    a=100;b=200

+:加法expr $a + $b 结果为 300
-:减法expr $a - $b 结果为 -100
*:乘法expr $a \* $b 结果为 2000
/:除法expr $b / $a 结果为 2 %:取余expr $b % $a 结果为 0
=:赋值a=$b 将把变量 b 的值赋给 a
==:相等,用于比较两个数字,相同则返回 true,[ $a == $b ] 返回 false
!=:不相等,用于比较两个数字,不相同则返回 true,[ $a != $b ] 返回 true

实例:

#!/bin/bash
a=100;
b=200;

va=`expr $a + $b`
echo "a+b:$va"

va=`expr $a - $b`
echo "a-b:$va"

va=`expr $a \* $b`
echo "a*b:$va"

va=`expr $a / $b`
echo "a/b:$va"

va=`expr $a % $b`
echo "a%b:$va"

if [ $a == $b ]
then
  echo "a等于b"
 else
   echo "a不等于b"
  fi
 [root@localhost project]# ./yyt.sh 
a+b:300
a-b:-100
a*b:20000
a/b:0
a%b:100
a不等于b
  • 关系运算符(关系运算符只支持数字)
    a=100;b=200

-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

实例:

#!/bin/bash
a=100;
b=200;

if [ $a -eq $b ]
then
  echo "$a -eq $b : a等于b"
  else
    echo "$a -eq $b: a不等于b"
    fi
if [ $a -ne $b ]
then
  echo "$a -ne $b : a不等于b"
  else
    echo "$a -ne $b: a等于b"
    fi
if [ $a -gt $b ]
then
  echo "$a -gt $b : a大于b"
  else
    echo "$a -gt $b: a不大于b"
    fi
if [ $a -lt $b ]
then
  echo "$a -lt $b : a小于b"
  else
    echo "$a -lt $b: a不小于b"
    fi
if [ $a -ge $b ]
then
  echo "$a -ge $b : a大于等于b"
  else
    echo "$a -ge $b: a不大于等于b"
    fi
if [ $a -le $b ]
then
  echo "$a -le $b : a小于等于b"
  else
    echo "$a -le $b: a不小于等于b"
    fi
[root@localhost project]# ./yyt.sh 
100 -eq 200: a不等于b
100 -ne 200 : a不等于b
100 -gt 200: a不大于b
100 -lt 200 : a小于b
100 -ge 200: a不大于等于b
100 -le 200 : a小于等于b
  • 布尔运算符
    a=100;b=200

!:非运算,表达式为 true 则返回 false,否则返回 true,[ ! false ] 返回 true
-o:或运算,有一个表达式为 true 则返回 true,[ $a -lt $b -o $b -gt 1000 ] 返回 true
-a:与运算,两个表达式都为 true 才返回 true,[ $a -lt $b -a $b -gt 1000 ] 返回 false

实例:

#!/bin/bash
a=100;
b=200;

if [ $a != $b ]; then
    echo " &a != $b : a不等于b"
    else
    echo " $a != $b : a等于b"
fi

if [ $a -le $b -a $b -ge $a ]; then
    echo " $a -le $b -a $b -ge $a : true"
    else
    echo " $a -le $b -a $b -ge $a : false"
fi

if [ $a -ge $b -a $b -gt $a ]; then
    echo " $a -ge $b -a $b -gt $a : true"
    else
    echo " $a -ge $b -a $b -gt $a : false"
fi

if [ $a -ge $b -o $b -gt $a ]; then
    echo " $a -ge $b -a $b -gt $a : true"
    else
    echo " $a -ge $b -a $b -gt $a : false"
fi

if [ $a -ge $b -o $b -lt $a ]; then
    echo " $a -ge $b -o $b -lt $a : true"
    else
    echo " $a -ge $b -o $b -lt $a : false"
fi
[root@localhost project]# ./yyt.sh 
 &a != 200 : a不等于b
 100 -le 200 -a 200 -ge 100 : true
 100 -ge 200 -a 200 -gt 100 : false
 100 -ge 200 -a 200 -gt 100 : true
 100 -ge 200 -o 200 -lt 100 : false
  • 逻辑运算符
    a=100;b=200

&&:逻辑的 AND[[ $a -lt 1000 && $b -gt 1000 ]] 返回 false
||:逻辑的 OR[[ $a -lt 1000 || $b -gt 1000 ]] 返回 true

实例:

#!/bin/bash
a=100;
b=200;

if [[ $a -le 1000 && $b -ge 1000 ]]
then
    echo " $a -le 1000 && $b -ge 1000: true"
    else
    echo " $a -le 1000 && $b -ge 1000 : false"
fi

if [[ $a -le 1000 && $b -lt 1000 ]]
then
    echo " $a -le 1000 && $b -lt 1000 : true"
    else
    echo " $a -le 1000 && $b -lt 1000 : false"
fi

if [[ $a -le 1000 || $b -ge 1000 ]]
then
    echo " $a -le 1000 && $b -ge 1000 : true"
    else
    echo " $a -le 1000 && $b -ge 1000 : false"
fi

if [[ $a -ge 1000 && $b -gt 1000 ]]
then
    echo " $a -ge 1000 && $b -gt 1000 : true"
    else
    echo " $a -ge 1000 && $b -gt 1000 : false"
fi
[root@localhost project]# ./yyt.sh 
 100 -le 1000 && 200 -ge 1000 : false
 100 -le 1000 && 200 -lt 1000 : true
 100 -le 1000 && 200 -ge 1000 : true
 100 -ge 1000 && 200 -gt 1000 : false
  • 字符串运算符
    a=100;b=200

=:检测两个字符串是否相等,相等返回 true,[ $a = $b ] 返回 false
!=检测两个字符串是否相等,不相等返回 true,[ $a != $b ] 返回 true
-z检测字符串长度是否为0,为0返回 true,[ -z $a ] 返回 false
-n检测字符串长度是否为0,不为0返回 true,[ -n $a ] 返回 true
str检测字符串是否为空,不为空返回 true,[ $a ] 返回 true

实例:

#!/bin/bash
a="abcd"
b="efgh"

if [ $a = $b ]
then
  echo "$a = $b :a等于b"
else
  echo "$a = $b :a不等于b"
fi

if [ $a != $b ]
then
  echo "$a != $b :a不等于b"
else
  echo "$a != $b :a等于b"
fi
if [ -z $a ]
then
  echo "-z $a :字符串a长度为0"
else
  echo "-z $a :字符串a长度不为0"
fi
if [ -n $a ]
then
  echo "-n $a :字符串a长度不为0"
else
  echo "-n $a :字符串a长度为0"
fi
if [ $a ]
then
  echo "$a :字符串不为空"
else
  echo "$a :字符串a为空"
fi
[root@bogon project]# ./yyt.sh 
abcd = efgh :a不等于b
abcd != efgh :a不等于b
-z abcd :字符串a长度不为0
-n abcd :字符串a长度不为0
abcd :字符串不为空
  • 文件测试运算符

-b file:检测文件是否是块设备文件,如果是,则返回 true,[ -b $file ] 返回 false
-c file:检测文件是否是字符设备文件,如果是,则返回 true,[ -c $file ] 返回 false
-d file:检测文件是否是目录,如果是,则返回 true,[ -d $file ] 返回 false
-f file:检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true,[ -f $file ] 返回 true
-g file:检测文件是否设置了 SGID 位,如果是,则返回 true,[ -g $file ] 返回 false
-k file:检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true,[ -k $file ] 返回 false
-p file:检测文件是否是有名管道,如果是,则返回 true,[ -p $file ] 返回 false
-u file:检测文件是否设置了 SUID 位,如果是,则返回 true,[ -u $file ] 返回 false
-r file:检测文件是否可读,如果是,则返回 true,[ -r $file ] 返回 true
-w file:检测文件是否可写,如果是,则返回 true,[ -w $file ] 返回 true
-x file:检测文件是否可执行,如果是,则返回 true,[ -x $file ] 返回 true
-s file:检测文件是否为空(文件大小是否大于0),不为空返回 true,[ -s $file ] 返回 true
-e file:检测文件(包括目录)是否存在,如果是,则返回 true,[ -e $file ] 返回 true

#!/bin/bash
file="/myshell/project/wy.sh"
if [ -r $file ]
then
  echo "文件可读"
else
  echo "文件不可读"
fi

if [ -w $file ]
then
  echo "文件可写"
else
  echo "文件不可写"
fi

if [ -x $file ]
then
  echo "文件可执行"
else
  echo "文件不可执行"
fi

if [ -e $file ]
then
  echo "文件存在"
else
  echo "文件不存在"
fi

if [ -f $file ]
then
  echo "文件是普通文件"
else
  echo "文件不是普通文件"
fi

if [ -d $file ]
then
  echo "文件是个目录"
else
  echo "文件不是个目录"
fi

if [ -s $file ]
then
  echo "文件不为空"
else
  echo "文件为空"
fi
[root@bogon project]# ./yyt.sh 
文件可读
文件可写
文件可执行
文件存在
文件是普通文件
文件不是个目录
文件不为空

4、shell echo命令

1、echo输出普通字符串

  • eg:echo it is a test等于echo “it is a test”
it is a test

2、显示转义字符

  • eg:echo \" it is a test\"
 "it is a test"

3、显示变量

  • eg: #!/bin/bash
    p=good
    echo “i am a $p man” `
[root@bogon project]# ./yyt.sh
  i am a good man
  • eg:#!/bin/bash
  • read p
    -echo “$p is a good man” `
[root@bogon project]# ./yyt.sh
yyt
yyt is a good man

4、显示换行

  • eg:#!/bin/bash
    echo -e “yyt is a good man \n”
    echo “he is a good person”
[root@bogon project]# ./yyt.sh
yyt is a good man

he is a good person

5、显示不换行

  • eg:#!/bin/bash
    echo -e “yyt is a good man \c”
    echo “he is a good person”
 [root@bogon project]# ./yyt.sh
yyt is a good manhe is a good person

6、显示结果定向至文件
eg:#!/bin/bash
echo “It is a test” > test

[root@bogon project]# ./yyt.sh
[root@bogon project]# cat test 
It is a test

7、原样输出字符串,不进行转义或取变量(用单引号)
#!/bin/bash
echo ‘$name"’

$name\"

8、显示命令执行结果
#!/bin/bash
a=1
b=3
echo expr $a + $b

[root@bogon project]# ./yyt.sh
4

你可能感兴趣的:(shell传递参数,shell数组,shell运算符和echo,字符串,shell,linux,python,pycharm)