shell脚本学习

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell脚本学习相关的知识,希望对你有一定的参考价值。

Shell脚本是什么

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

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


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

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

技术分享


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

两种类型的变量:

    系统定义变量

    用户定义变量

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


特殊变量

test.sh文件中

技术分享

运行结果:

技术分享


“#!/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

运行结果:

 技术分享


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

运行结果:

技术分享

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

运行结果:

技术分享


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

运行结果:

技术分享


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 $?

结果:

技术分享

test.sh:

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

结果:

技术分享


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

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


技术分享

[ -d 文件名 ]

[ -d "$str" ]

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

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

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

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

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

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

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


如何执行算术运算

两种方法:

    1、使用expr命令 

     技术分享

    2、$[ 表达式 ],如:

    技术分享



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

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

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


在shell脚本中如何定义函数

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

function 函数名(){

    命令

    return 0

}


${ }的一些特异功能

定义一个变量:

file=dir1/dir2/dir3/my.file.txt

可以用${ }分别替换获得不同的值:

${file#*/} 拿掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt

${file##*/} 拿掉最后一个 / 及其左边的字符串:my.file.txt

${file#*.} 拿掉第一个 . 及其左边的字符串:file.txt

${file##*.} 拿掉最后一个 . 及其左边的字符串:txt

${file%/*} 拿掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3

${file%%/*} 拿掉第一个 / 及其右边的字符串:(空值)

${file%.*} 拿掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file

${file%%.*} 拿掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my

test.sh:

file=dir1/dir2/dir3/my.file.txt
 
echo ${file#*/}
echo ${file##*/}
echo ${file#*.}
echo ${file##*.}
echo ${file%/*}
echo ${file%%/*}
echo ${file%.*}
echo ${file%%.*}
 
echo ${file:0:4}
echo ${file:4:5}
 
echo ${file/dir/path}
echo ${file//dir/path}
                                                                                
echo ${#file}

运行结果:

技术分享


如何调试shell脚本

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

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


下面有三段代码

1.

cd ..

ls


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)



《完》

本文出自 “零蛋蛋” 博客,请务必保留此出处http://lingdandan.blog.51cto.com/10697032/1789336

以上是关于shell脚本学习的主要内容,如果未能解决你的问题,请参考以下文章

Linux学习记录:Shell脚本

shell脚本编程学习笔记-shell脚本编程基础介绍

学习Shell脚本

shell脚本学习总结

shell脚本学习

01 shell编程之变量定义