Shell脚本学习
#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。
新建.sh文件 touch stntest.sh
#!/bin/bash
1.作为可执行程序执行脚本
chmod +x ./test.sh    使得脚本具有可以执行的权限
可以将shell脚本保存成.sh文件,保存后可以进行执行 ./test.sh
2.作为解释器参数执行脚本
sh test.sh
使用变量
your_name="qinjx"
echo $your_name
echo ${your_name}
已经被定义的变量,可以重新被定义
只读变量:使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变
readonly your_name
删除变量
使用 unset 命令可以删除变量。语法:unset variable_name
变量被删除后不能再次使用。unset 命令不能删除只读变量
变量类型
运行shell时,会同时存在三种变量:
- 1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
 - 2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
 - 3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
 
Shell 字符串
单引号
str='this is a string'
双引号
your_name='runoob' str="Hello, I know you are \"$your_name\"! \n" echo -e $str
双引号的优点:
- 双引号里可以有变量
 - 双引号里可以出现转义字符
 
获取字符串长度
string="abcd"
echo ${#string} #输出 
提取子字符串
以下实例从字符串第 2 个字符开始截取 4 个字符:
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo
查找子字符串
查找字符 i 或 o 的位置(哪个字母先出现就计算哪个):
string="runoob is a great site"
echo `expr index "$string" io`  # 输出 4
 以上脚本中 ` 是反引号,而不是单引号 ',不要看错了哦。
Shell 数组
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
类似于 C 语言,数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。
定义数组:array_name=(value0 value1 value2 value3) or array_name[0]=value0 array_name[1]=value1 array_name[n]=valuen
读取数组
${数组名[下标]}
valuen=${array_name[n]}
获取数组的长度
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}
多行注释
:<<EOF
注释内容...
注释内容...
注释内容...
EOF
Shell 传递参数
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推…… $0 为执行的文件名:
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com
echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
将以上脚本存为test.sh文件
$ chmod +x test.sh $ ./test.sh 1 2 3
输出结果:
Shell 传递参数实例! 执行的文件名:./test.sh 第一个参数为:1 第二个参数为:2 第三个参数为:3
#/bin/bash
echo "This is for test"
echo "这是该文件的文件名 $0"
echo "这是输入的第一个参数 $1"
echo "这是输入的第二个参数 $2"
echo "这是传递到脚本的参数个数 $#"
echo "传参按照字符串形式输出 $*"
echo "这是脚本当前运行的进程号 $$"
echo "这是后台运行的进程号 $!"
echo "这是显示最后命令的退出状态 $?"
$? 获取上一个命令的退出状态 or 获取函数的返回值
 
Shell 基本运算符
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。例如,两个数相加(注意使用的是反引号 ` 而不是单引号 '):
#!/bin/bash
val=`expr 2 + 2`
echo "两数之和为 : $val"
表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。
乘法 `expr $a \* $b` 除法`expr $b / $a` 取余 `expr $b % $a` 赋值a=$b 比较[ $a == $b ] 返回true或false
注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。
乘号(*)前边必须加反斜杠(\)才能实现乘法运算;
关系运算符
-eq 判断是否相等
-ne判断是否不相等
-gt 判断左面的数是否大于右面的
-lt 判断左面的数是否小于右面的
-ge 判断左面的数是否大于等于右面的
-le 判断左面的数是否小于等于右面的
布尔运算符
!非运算
-o 或运算
-a 与运算
逻辑运算符
&& 逻辑的AND
|| 逻辑的OR
字符串运算符
=判断 两个字符串是否相等
-z 判断字符串长度是否为0
-n 判断字符串长度是否不为0
$ 判断字符串是否为空
显示变量
read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量
#!/bin/sh read name echo "$name It is a test"
输出
[root@www ~]# sh test.sh
OK                     #标准输入
OK It is a test        #输出
显示换行/不换行
\n换行 \c不换行
显示结果定向至文件
echo  "it is a test" >myfile.log
将查询结果导出至文件中
grep -E '1805|1905' CloudPayment.log > out.log
cat CloudPayment.log | grep "1805" | grep "1905" > out.log
符号“>”表示擦除后写入文档 ; “>>”表示追加到文档
输出文件后将文件下载 sz filename 文件路径:C:\Users\songtianning\Downloads
显示命令执行结果
echo `date`
注意:显示时间时候会与实际时间相差8小时,所以要先设置时区 export TZ='CST-8'
Shell printf 命令
printf 命令的语法:format-string: 为格式控制字符串 arguments: 为参数列表
printf  format-string  [arguments...]
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg  
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
%-10s 指一个宽度为10个字符
%-4.2f 指格式化为小数,其中.2指保留2位小数。
Shell test 命令
Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
Shell 流程控制
if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi
if else-if else
if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi
if else语句经常与test命令结合使用,如下所示:
num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
    echo '两个数字相等!'
else
    echo '两个数字不相等!'
fi
for 循环
for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done
举例
for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done
while 语句
while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:
while condition do command done
举例
#!/bin/bash
int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done
while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按<Ctrl-D>结束循环。
echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的网站名: '
while read FILM
do
    echo "是的!$FILM 是一个好网站"
done
until 循环
until 循环执行一系列命令直至条件为 true 时停止。
until 循环与 while 循环在处理方式上刚好相反。
一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。
case
Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:
case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac
case工作方式如上所示。取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。
取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
实例:
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
    1)  echo '你选择了 1'
    ;;
    2)  echo '你选择了 2'
    ;;
    3)  echo '你选择了 3'
    ;;
    4)  echo '你选择了 4'
    ;;
    *)  echo '你没有输入 1 到 4 之间的数字'
    ;;
esac
Shell 函数
shell中函数的定义格式如下:
[ function ] funname [()]
{
    action;
    [return int;]
}
说明:
- 1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
 - 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255
 
所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。
函数参数
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...
带参数的函数示例:
funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数
$#传递到脚本或函数的参数个数
$*以一个单字符串显示所有向脚本传递的参数
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。获取函数的返回值
$ wc -l << EOF
    欢迎来到
    菜鸟教程
    www.runoob.com
EOF
3          # 输出结果为 3 行
$
Shell 文件包含
和其他语言一样,Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。
Shell 文件包含的语法格式如下:
. filename   # 注意点号(.)和文件名中间有一空格
或
source filename
创建两个 shell 脚本文件。
test1.sh
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com
url="http://www.runoob.com"
test2.sh
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com
#使用 . 号来引用test1.sh 文件
. ./test1.sh
# 或者使用以下包含文件代码
# source ./test1.sh
echo "菜鸟教程官网地址:$url"
                    
                
                
            
        
浙公网安备 33010602011771号