Shell编程基础总结

Shell编程基础总结

#!/bin/bash
#This is my first shell script.
echo -n "The current date and time is:"
date
who
echo -n "The current users is:"
who | wc -l

第1行中的“#!/bin/bash“用来指定执行脚本的shell为bash。如果要在脚本中指定执行的shell,必须在第1行指定。若没有指定,就会使用当前正在使用的shell来指定该脚本。


执行 shell 脚本的方法

  • 以输入重定向的方式让shell从脚本中读取命令并执行
 [root@localhost test]# bash
  • 以脚本名作为shell命令的参数,形式为:shell名 脚本名 [参数]
[root@localhost test]# bash sysinfo
  • 使用(.)命令,shell的一个内部命令,表示当前正在使用的shell。
 [root@localhost test]# . sysinfo
  • 使用chmod命令增加脚本的执行权限,然后再提示符下通过脚本名来执行。
[root@localhost test]# ls -l sysinfo
-rw-r--r--. 1 root root 137 1月  19 10:22 sysinfo
[root@localhost test]# chmod a+x sysinfo
[root@localhost test]# ./sysinfo
The current date and time is:20180119日 星期五 10:30:25 CST
root     :0           2018-01-19 10:19 (:0)
root     pts/0        2018-01-19 10:20 (192.168.1.18)
The current users is:2

shell 变量

变量名=变量值

filename=/home/student/test

注意:等号的左右两边不能有空格。变量名是以字母和下划线开头的字母、数字和下划线字符序列,且区分大小写。
若给变量值中含有空格,需要用双引号括起来。如:

name="Zhang San"

要引用变量,需要在变量名前加”$”符号。如:

echo $name

env 命令

可以在shell中使用evn命令列出已经定义的所有环境变量。

[root@localhost ~]# env | more
XDG_SESSION_ID=3
HOSTNAME=localhost
SELINUX_ROLE_REQUESTED=
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.1.18 51528 22
SELINUX_USE_CURRENT_RANGE=
SSH_TTY=/dev/pts/0
USER=root
...

Shell编程基础总结_第1张图片


位置变量

在执行shell脚本时允许命令行给出传递给shell脚本的参数,这些参数被存储在变量名为0,1,2,…的特殊变量里,称为位置变量。因为这些变量名时与命令行上参数的位置相对应的。

#!/bin/bash
#This script shows how to use th position variable.
echo "The number of command line parameters is $#"
echo "The command line parameters is: $*"
echo "The script name is $0"
echo "The first parameter is $1"
echo "The second parameter is $2"
echo "The third parameter is $3"

执行如下:

[root@localhost test]# bash showposvar one two three
The number of command line parameters is 3
The command line parameters is: one two three
The script name is showposvar
The first parameter is one
The second parameter is two
The third parameter is three

条件测试

test condition

[ condition ]

这两种方式时等价的,第1种是使用shell内部的test命令,第2种是用方括号代替test。注意,方括号中条件的左右必须有空格,其中的测试条件可以是数值测试、字符串测试或文件测试。

Shell编程基础总结_第2张图片


if 分支结构

if 条件测试1
then
commands_1
elif 条件测试2
then
commands_2
elif 条件测试3
then
commands_3

else
commands_n
fi

fi(if的反写)必须与if成对出现。elif和else分支根据实际需要,可有可无。

实例:

#!/bin/bash
#A script using the if structrue.
if [ -f $1 ]
then
   echo "$1 is an ordinary file."
   cat $1
elif [ -d $1 ]
then
   echo "$1 is an directory"
   ls $1
else
   echo "$1 is neither an ordinary file nor a direcotry."
fi

执行如下:

[root@localhost test]# bash testif /usr/
/usr/ is an directory
bin  games    lib    libexec  sbin   src   tmp
etc  include  lib64  local    share  test

case 分支结构

case 字符串 in
匹配字符串 1)
commands_1;;
匹配字符串 2)
commands_2;;
… *)
commands_n;;
esac

若没找到匹配的字符串,就执行星号(*)后面的commands_n.匹配字符串可以使用通配符。

实例:

#!/bin/bash
#A script using th case structrue.
#display a menu
echo "***********"
echo "1 Download"
echo "2 Upload"
echo "3 Exit"
echo "***********"
echo -n "Please enter a choice:"
#read th user choice form keyboard
read choice
case $choice in
1|D)
   echo "You select th download menu";;
2|U)
   echo "You select the uplaod menu";;
3|E)
   echo "You select the exit menu"
   exit;;
*)
   echo "Sorry,your choice is not a valid choice";;
esac

执行如下:

[root@localhost test]# bash testcase
***********
1 Download
2 Upload
3 Exit
***********
Please enter a choice:1
You select th download menu

循环结构

while 条件测试
do
comands
done

until 条件测试
do
commands
done
当条件测试结果为假时执行。

for 变量 in 值表
do
commands
done

其中的值可以时命令行实际参数,此时变量将依次取位置变量(从$1开始)的值,对每个位置变量执行一次循环体,循环体执行的次数等于命令行实际参数的个数。此时的for语句可是书写成如下形式:

for 变量 in $*
do
commands
done

for 变量
do
commands
done

实例:下面的shell脚本将命令行参数所指定的文件或目录依次复制到当前目录下新建的mydir目录中。

#!/bin/bash
#A script to copy file
mkdir mydir
for file
do
  cp -r $file mydir
done

read 命令

从标准输入中读取用户输入,并将其存储在用户自定义变量中。这是程序与用户交换的重要方法。

#!/bin/bash
#A script using read command
echo -n  "Please input some words:"
read a b c
echo "a=$a"
echo "b=$b"
echo "c=$c"

命令置换

命令置换可以将一个命令的输出用做另一个命令的参数。命令置换用倒引号(`)(Esc 键下面的)括起来的部分。执行时,会将命令执行结果展示在倒引号部分。

#!/bing/bash
#A script using comand replacement
echo "The current directory:pwd"
echo "The current directory:`pwd`"
path=`pwd`
echo $path

执行如下:

[root@localhost test]# bash testcom
The current directory:pwd
The current directory:/usr/test
/usr/test

set 命令

给位置变量赋值,这也是在程序中给位置变量赋值的一种方法。


#!/bin/bash
#A script using the shift command
until [ -z $1 ]
do
  echo $1
  shift
done
echo $0

执行如下:

[root@localhost test]# bash testset
one two three
2018年 01月 19日 星期五 12:06:13 CST
2018年 01月 19日

shift 命令

参数向左移动,形式为:shift n
.若未带参数,缺省是向左移动1位。

#!/bin/bash
#A script using the shift command
until [ -z $1 ]
do
  echo $1
  shift
done
echo $0

执行如下:

[root@localhost test]# bash testshift  one two thredd
one
two
thredd
testshift

expr 命令

处理算术运算,形式为:expr expression
注意:运算符号左右必须有空格。 特殊字符如 *、%、(、)、>、<等,前面叫“\”。


[root@localhost test]# expr 3 + 1
4

[root@localhost test]# expr 2 \* 3
6

let 命令

也是来处理算术运算,它包括了expr. 形式为: let expressiong 或者 ((expression))
注意:let中的变量利用变量名直接访问,不需要在签名加$符号。表达式之间也不需要有空格。乘号也不需要加前导符。取得表达式的值,可采用$((表达式))。


[root@localhost test]# i=5
[root@localhost test]# let i=i*6
[root@localhost test]# echo $i
30
[root@localhost test]# echo $((3*2))
6

break 和 continue 命令

break 命令用来结束循环,将程序流程转向循环结束的下一条命令。语法形式为:
break n
其中,n为跳出循环的层数(嵌套循环),若不带参数,默认为1。

continue 命令则结束本次循环,进入下一次循环。语法形式为:
continue n
其中,n为结束的循环次数,缺省值为1。

#!/bin/bash
#A script using the break and continue commad
count=0
while true
do
  read key
  if [ $key = q ]
  then
      break
  elif [ $key = c ]
  then
      continue
  else
      echo $key
      count=$((count+1))
  fi
done
echo "count=$count"

执行如下:


[root@localhost test]# bash testbreak
k
k
h
h
c
g
g
q
count=3

exit 命令

shell的内部命令,在脚本中用来立即退出正在执行的脚本。语法形式:
exit n
其中,n为退出状态,若没有提供,则设为执行的最后一条命令的退出值。


here 文档

又称即时文档,是另一种形式的输入重定向,提供了在脚本程序中向一条命令传递输入的方法,形式:
命令 [参数] <<标记符
文档正文
标记符

标记符由用户自定义,必须成对出现。

#!/bin/bash
cat << !HERE!
This is a here document.
Thank you!
!HERE!

执行如下:


[root@localhost test]# bash testhere
This is a here document.
Thank you!

信号

在shell中提供了用来捕捉信号的trap命令(比如用户按下键盘的Ctrl+c组合键,在执行的shell脚本有时需要捕捉这个信号,进行特殊处理),该命令对收到的信号有三种处理方式:
1.执行指定命令来处理信号,其使用形式: trap “命令序列” 信号列表
当进程捕捉到信号列表中指定的信号时,将执行命令序列中的命令。信号列表可以使用信号名或者对应的信号编号,信号之间用空格隔开。
2.忽略信号,其使用形式为:trap “” 信号列表
当收到信号列表中指定的信号时就好像没发生一样,信号被忽略。
3.进行缺省处理,信号的缺省处理是立刻结束收到信号的进程。要恢复信号的缺省处理功能,可使用如下形式:trap 信号列表。

Shell编程基础总结_第3张图片

#!/bin/bash
#A script using the trap command
trap "echo I have recieved SIGINT" SIGINT
echo "Please input Ctrl+c to tese the trap command."
read key1
echo $key1
trap 2
echo "Please input Ctrl+c to test the recoved default processing."
read key2
echo $key2

执行如下:

[root@localhost test]# bash testsig
Please input Ctrl+c to tese the trap command.
^CI have recieved SIGINT


Please input Ctrl+c to test the recoved default processing.
^C
[root@localhost test]#

函数

函数定义语法为:
函数名()
{
commands
}

#!/bin/bash
#A script using th funciton
#shell 函数小事例
myfunc()
{
 echo "function begin"
 let "c=a+b"
 echo $c
 echo "The paramters of the function is: $1 $2 $3"
 echo "function end"
}

a=1
b=2
c=0
myfunc one two three
echo "a=$a b=$b c=$c"

执行如下:

[root@localhost test]# bash testfunc
function begin
3
The paramters of the function is: one two three
function end
a=1 b=2 c=3

跟踪和调试

set命令
参数:
-n:读取一遍脚本中的命令但不执行,用来在执行程序前检查脚本中的语法错误。
-x:显示在完成参数及命令替换完成后脚本文件中的命令,并在行首显示“+”号。可用来跟踪和调试脚本。
-v:与-x选项类似,但会显示变量替换前的命令行。
开始调试:set -x
关闭调试:set +x


#!/bin/bash
#A script using the break and continue commad
set -x
count=0
while true
do
  read key
  if [ $key = q ]
  then
      break
  elif [ $key = c ]
  then
      continue
  else
      echo $key
      count=$((count+1))
  fi
done
echo "count=$count"
set +x

执行如下:

[root@localhost test]# bash testbreak
+ count=0
+ true
+ read key
w+ count=0
+ true
+ read key
w
+ '[' w = q ']'
+ '[' w = c ']'
+ echo w
w
+ count=1
+ true
+ read key
w
+ '[' w = q ']'
+ '[' w = c ']'
+ echo w
w
+ count=2
+ true
+ read key
c
+ '[' c = q ']'
+ '[' c = c ']'
+ continue
+ true
+ read key
q
+ '[' q = q ']'
+ break
+ echo count=2
count=2
+ set +x
[root@localhost test]#

转载请标明出处:http://blog.csdn.net/renli2549/article/details/79105587

你可能感兴趣的:(Linux,基础)