Shell脚本是什么

一个Shell脚本是一个文本文件,包含一个或多个命令。

作为系统管理员,我们经常需要使用多个命令来完成一项任务,我们可以添加这些命令在一个文本文件(Shell脚本)来完成这些日常工作任务。


什么是默认登录Shell,如何改变指定用户的登录Shell

在Linux操作系统,“/bin/bash”是默认登陆shell,是在创建用户时分配的。使用chsh命令可改变默认的shell

wKiom1df-g7CsjO3AAAbWQ0IGJA606.png


可在Shell脚本中使用哪些类型的变量

两种类型的变量:

    系统定义变量

    用户定义变量

“set”命令或 echo $变量名  可查看变量值


特殊变量

test.sh文件中

wKiom1dgCaGhGwo0AAAZGLtj_xo609.png

运行结果:

wKioL1dgComQbQxhAAA1Vn6Ii×××9.png


“#!/bin/bash”的作用

这是shell脚本的第一行,成为(shebang)行,这里#叫做hash,!叫做bang

它的意思是命令通过/bin/bash来执行


如何使脚本可执行

chmod u+x test.sh


如何加入注释

注释以#开头


如何取消变量或变量赋值

unset 变量名


如何让shell就脚本得到来自终端的输入

read命令得到用户的输入并置于你给出的变量中


if

if [ 条件 ];then

    命令1

    命令2

    ...

elif [ 条件 ];then  

    命令1

    命令2

    ...

else

    if [ 条件 ];then  

        命令1

        命令2

        ...

    else

        命令1

        命令2

        ...

    fi

fi

test.sh:

printf "Please Enter Your Name: "
read name
printf "Please Enter Your score: "                                              
read score
 
#[[ $score -lt 90 ]] || {
[ $score -lt 90 ] || {
    echo "hi,$name,you are very good!"
}
 
if [ $score -ge 90 ];then
    echo "hi ${name},you are very good!"
elif [ $score -ge 80 -a $score -lt 90 ];then
    echo "hi $name,you are good!"
elif [ $score -ge 60 -a $score -lt 80 ];then
    echo "hi $name,you are normal!"
else
    echo "who are you??"
fi

运行结果:

 wKiom1dgD-KxVG8NAAB8Rx0_50g679.png


for

for 变量 in 循环列表

do

命令1

命令2

...

done

test.sh:

for i in  {a..z}
do                                                                              
    if [ -b /dev/sd${i} ];then
        echo "yes!,disk id /dev/sd${i}"
    fi  
done

运行结果:

wKiom1dgEH3SZSWYAAAO3y2ZqHk099.png

test.sh:

sum=0                                                                           
for i in {1..100}
do
    let sum+=i
done
echo "$sum"

运行结果:

5050

test.sh:

sum=0                                                                           
for (( i=0; i<=100; i++ ))
do
    let sum+=i
done
echo $sum

运行结果:

5050


while

while [ 条件 ]

do

命令

done

test.sh:

while [ $# -gt 0 ]                                                              
do
    echo $1
    shift 1
done

运行结果:

wKiom1dgE2bTT3vwAAAXPmvNp3s379.png


do-while

do

{

  命令

}while(条件)


case

case 变量 in

    值1)

    命令

    ;;

    值2)

    命令

    ;;

    *)

    命令

    ;;    

esac

test.sh:

    
case "$1" in
    start | -s | -S )                                                           
        echo "your cmd is start"
        ;;  
    st[oO]p )
        echo "your cmd is stop"
        ;;  
    restart )
        echo "your cmd is restart"
        ;;  
    * ) 
        echo "your cmd is default"
        ;;  
esac

运行结果:

wKiom1dgERLywbpGAAAxeeMoEno499.png


until

test.sh:

                                                                            
i=0
sum=0
until [ $i -gt 100 ]
do
    let sum+=i
    let i++ 
done
echo $sum

运行结果:

5050


shell脚本中“$?”标记的用途是什么

在写一个shell脚本时,如果你想要检查前一条命令是否执行成功,“$?”可以来检查前一条命令的结束状态,0为成功


在shell脚本中如何比较两个数字

可用test 或[ 测试,如:

#!/bin/bash
x=10
y=20
if [ x -gt y ];then
    echo "x > y"
else
    echo "y <= x"
fi


在shell脚本中如何比较两个字符串

test.sh:

str="hello WORLD"
[ "X$str" == "Xhello world" -o "X$str" == "Xhello WORLD" ]
echo $?
[ "X$str" == "Xhello WORLD" -a -f "test.sh" -a -d "dir" -a ! "Xstr" == "Xhello bit" ]
echo $?

结果:

wKioL1dgECHz4x1uAAAM6AmTcjk647.png

test.sh:

read str 
 
[ "X$str" == "X" ]
echo $?
[ -z "$str" ]
echo $?
[ ! -z "$str" ]
echo $?
[ -n "$str" ]
echo $?
[ ! -n "$str" ]
echo $?
                                                                                
[ ! "X$str" != "Xhello" ]
echo $?

结果:

wKioL1dgDxDjtCX4AAAh-lOBXbM473.png


在shell脚本中,如何测试文件

test命令 或[命令 ,举例如下:


wKioL1dgA0Xyhv4HAAAVXIu8NVA177.png

[ -d 文件名 ]

[ -d "$str" ]

其中-d表示如果文件存在且是目录,返回true,当然也可以是别的选项,不止-d

  -e表示如果文件存在,返回true

  -f表示如果文件存在且是普通文件,返回true

  -r表示如果文件存在并且可读,返回true

  -s表示如果文件存在且不为空,返回true

  -w表示如果文件存在并且可写,返回true

  -x表示如果文件存在并且可执行,返回true


如何执行算术运算

两种方法:

    1、使用expr命令 

     wKioL1dgB33TU_5xAAAx9CT0qCw004.png

    2、$[ 表达式 ],如:

    wKioL1dgByWj-Ns8AAAWdn2M9SA058.png



如何将标准输出和错误输出重定向到同一位置

1、如 ls /usr/share/doc > out.txt 2>&1

2、如 ls /usr/share/doc &> out.txt


在shell脚本中如何定义函数

函数是拥有名字的代码块。当我们定义代码块,我们就可以在我们的脚本调用函数名字,该代码块就会被执行。

function 函数名(){

    命令

    return 0

}


如何调试shell脚本

1、使用‘-x’参数(bash -x test.sh)

2、使用 '-nv'参数(bash -nv test.sh)


  • -n,读一遍脚本中的命令但不执行,用于检查脚本中的语法错误

  • -v,一边执行脚本,一边将执行过的脚本命令打印到标准错误输出。

  • -x,提供跟踪执行信息,将执行的每一条命令和结果依次打印出来


调试方法:

(1) 命令行提供参数

(2) 脚本开头提供参数

  #! /bin/bash  -x

(3) 脚本中用set命令启用或禁用调试选项    

    #!/bin/bash

    foo() { echo "Shell bash function iscalled"; }

    echo "---start--"

    set -v

    foo

    set +v

    echo"---end--"

set -v和set+v分别表示启用和禁用-x参数,这样可以只对脚本中的某一段进行跟踪调试。


下面有三段代码

1.

#!/bin/sh

cd ..

ls


其中cd是Shell的内建命令,ls不是Shell的内建命令(可以用which ls查看)

则Shell执行此脚本的过程如下:

交互Shell(bash)fork/exec一个子Shell(sh)用于执行脚本,父进程bash等待子进程sh终止。

sh读取脚本中的cd..命令,调用相应的函数执行内建命令,改变当前工作目录为上一级目录。

sh读取脚本中的ls命令,fork/exec这个程序,列出当前工作目录下的文件,sh等待ls终止。

ls终止后,sh继续执行,读到脚本文件末尾,sh终止。

sh终止后,bash继续执行,打印提示符等待用户输入。


2.

VAR=45                                                                          

echo $(($VAR/3))

echo $((16#2a))


3.

DATA=`date`

echo ${DATA}

echo $DATA                                                                      

DATA=$(date)

echo $DATA

echo the last sunday is $(date -d "last sunday" +%Y-%m-%d)



《完》