Shell简介
Shell简单的说就是命令解析器,将用户输入的指令转换为相应的机器能够执行的程序。
Shell脚本是一个包含一系列命令序列的文本文件(批处理)。当运行这个脚本文件时,文件中包含的命令序列将得到执行。
HelloWorld
Shell脚本的第一行必须是如下格式: #!/bin/bash
符号#!用来指定该脚本文件的解析程序。例中使用bash,也可以使用其他shell。如#!/bin/sh。
当编辑好脚本后,必须使其具有可执行属性。 chmod +x filename
Shell脚本hello.sh
view plaincopy to clipboardprint?
#!/bin/bash
echo "hello world!"
mkdir ./helloworld
#!/bin/bash
echo "hello world!"
mkdir ./helloworld
Shell中的变量
在Shell编程中,所有的变量都由字符串组成,并不需要预先对变量声明。
Shell脚本s1.sh
view plaincopy to clipboardprint?
#!/bin/sh
#号后面是注释
#set variable a
a="hello"
#print a
echo "A is: $a"
#!/bin/sh
#号后面是注释
#set variable a
a="hello"
#print a
echo "A is: $a"
命令行参数传递
$#:传入脚本的命令行参数个数
$*:所有的命令行参数,各参数值之间留有空格
$0:命令本身(shell文件名)
$1:第一个命令行参数
$2:第二个命令行参数
shell脚本s2.sh
view plaincopy to clipboardprint?
#!/bin/sh
echo "numer of vars:"$#
echo "values of vars:"$*
echo "value of var1:"$1
echo "value of var2:"$2
echo "value of var3:"$3
echo "value of var4:"$4
#!/bin/sh
echo "numer of vars:"$#
echo "values of vars:"$*
echo "value of var1:"$1
echo "value of var2:"$2
echo "value of var3:"$3
echo "value of var4:"$4
运行 ./s2.sh a b c d
输出结果:
numer of vars:4
values of vars:a b c d
value of var1:a
value of var2:b
value of var3:c
value of var4:d
Shell中的局部变量
shell脚本s3.sh
view plaincopy to clipboardprint?
#!/bin/bash
hello="var1"
echo $hello
function funcl
{
local hello="var2"
echo $hello
}
funcl
echo $hello
#!/bin/bash
hello="var1"
echo $hello
function funcl
{
local hello="var2"
echo $hello
}
funcl
echo $hello
在变量首次被赋值时加上local关键字可以声明一个局部变量
注意:(1)变量赋值时,“=”左右两边都不能有空格
(2)BASH中的语句结尾不需要分号
Shell中的控制结构
if语句
if[expression]
then
#code block
if
if[expression]
then
#code block
else
#code block
fi
比较运算符
比较操作 整数操作 字符串操作 比较操作 整数操作 字符串操作
相同 -eq = 大于或等于 -ge
不同 -ne != 小于或等于 -le
大于 -gt > 为空 -z
小于 -lt < 不为空 -n
使用实例:
比较整数a是否大于整数b: if[ $a -gt $b ] 判断字符串a是否为空: if[ -z $a ]
注意:
(1)在"["和"]"符号的左右都留有空格 (2)"="左右都有空格
shell脚本s4.sh
view plaincopy to clipboardprint?
#!/bin/bash
a=$1
b=$2
if [ -z $a ] || [ -z $b ]
then
echo "please enter 2 no"
exit 1
fi
if [ $a -eq $b ] ; then
echo "number a = number b"
else if [ $a -gt $b ]
then
echo "number a>number b"
elif [ $a -lt $b ]
then
echo "number a
fi
#!/bin/bash
a=$1
b=$2
if [ -z $a ] || [ -z $b ]
then
echo "please enter 2 no"
exit 1
fi
if [ $a -eq $b ] ; then
echo "number a = number b"
else if [ $a -gt $b ]
then
echo "number a>number b"
elif [ $a -lt $b ]
then
echo "number a
fi
判断
-e 文件已经存在 -f 文件是普通文件 -s 文件大小不为零 -d 文件是一个目录
-r 文件对当前用户可以读取 -w 文件对当前用户可以写入 -x 文件对当前用户可以执行
shell脚本s5.sh
view plaincopy to clipboardprint?
#!/bin/sh
folder=/home
[ -r "$folder" ] && echo "Can read $folder"
[ -f "$folder" ] || echo "this is not file"
#!/bin/sh
folder=/home
[ -r "$folder" ] && echo "Can read $folder"
[ -f "$folder" ] || echo "this is not file"
shell脚本s6.sh
view plaincopy to clipboardprint?
#!/bin/bash
DIR=$1
#if the string empty
if [ "$DIR" = " " ]
then
echo "usage: `basename $0` directory to create" >&2
exit 1
fi
echo "dir" $DIR
if [ -d $DIR ]
then
echo "The directory already exist"
exit 0
else
echo "The directory does exist"
echo -n "Create is now? [Y/N]:"
read create
if [ "$create" = "y" ] || [ "$create" = "Y" ]
then
echo "creating now"
if [ mkdir $DIR ]
DIR=" "
fi
if [ "$DIR" = " " ]
then
echo "create directory sucess"
else
echo "create directory error"
fi
elif [ "$create" = "n" ] || [ "$create" = "N" ]
then
echo "does not create directory"
exit 0
else
echo "Errors order"
exit 1
fi
fi
#!/bin/bash
DIR=$1
#if the string empty
if [ "$DIR" = " " ]
then
echo "usage: `basename $0` directory to create" >&2
exit 1
fi
echo "dir" $DIR
if [ -d $DIR ]
then
echo "The directory already exist"
exit 0
else
echo "The directory does exist"
echo -n "Create is now? [Y/N]:"
read create
if [ "$create" = "y" ] || [ "$create" = "Y" ]
then
echo "creating now"
if [ mkdir $DIR ]
DIR=" "
fi
if [ "$DIR" = " " ]
then
echo "create directory sucess"
else
echo "create directory error"
fi
elif [ "$create" = "n" ] || [ "$create" = "N" ]
then
echo "does not create directory"
exit 0
else
echo "Errors order"
exit 1
fi
fi
for循环
for循环结构与C语言中有所不同,在bash中for循环的基本结构式
for var in [list]
do
#code lock
done
其中$var是循环控制变量,[list]是var遍历的一个集合,do/done对包含了循环体。
另外,如果for和do写在同一行,必须在do前面加";"。
shell脚本s7.sh
view plaincopy to clipboardprint?
#!/bin/bash
for day in Sun Mon Tue Wed Thu Fri Sat
do
echo $day
done
#!/bin/bash
for day in Sun Mon Tue Wed Thu Fri Sat
do
echo $day
done
shell脚本统计当前目录下的文件数
view plaincopy to clipboardprint?
#!/bin/bash
counter=0
for files in *
do
counter=`expr $counter + 1`
done
echo "There are $counter files in `pwd` we need to process"
#!/bin/bash
counter=0
for files in *
do
counter=`expr $counter + 1`
done
echo "There are $counter files in `pwd` we need to process"
shell脚本将用户输入的数字按倒序的方式输出
view plaincopy to clipboardprint?
#!/bin/bash
echo -n "Pleasw enter number : "
read n
sd=0
rev=""
on=$n
echo "$n"
while [ $n -gt 0 ]
do
sd=$(( $n % 10 )) # get Remainder
n=$(( $n / 10 )) # get next digit
rev=$( echo $rev$sd)
done
echo "$on in a reverse order $rev"
#!/bin/bash
echo -n "Pleasw enter number : "
read n
sd=0
rev=""
on=$n
echo "$n"
while [ $n -gt 0 ]
do
sd=$(( $n % 10 )) # get Remainder
n=$(( $n / 10 )) # get next digit
rev=$( echo $rev$sd)
done
echo "$on in a reverse order $rev"
until循环
until循环的基本结构
until [condition]
do
#code block
done
while和until的区别在于while是为真时执行,until是为假时执行。
shell脚本 移动一个文件,如果目标存在,监视该文件,直到文件被删除才移动文件。
view plaincopy to clipboardprint?
#!/bin/bash
if [ "$1" = "" ] || [ "$2" = "" ]
then
echo "Please enter file name"
exit 1
fi
if [ -e $2 ]
then
echo "The file already exists"
until [ ! -f $2 ]
do
sleep 1
done
fi
if [ ! `mv $1 $2` ]
then
echo "mv sucessful"
else
echo "mv error"
fi
#!/bin/bash
if [ "$1" = "" ] || [ "$2" = "" ]
then
echo "Please enter file name"
exit 1
fi
if [ -e $2 ]
then
echo "The file already exists"
until [ ! -f $2 ]
do
sleep 1
done
fi
if [ ! `mv $1 $2` ]
then
echo "mv sucessful"
else
echo "mv error"
fi
case语句
case语句结构
case "$var" in
condition1)
;;
condion2)
;;
*)
default statments;;
esac
shell脚本 判断键盘输入大小写
view plaincopy to clipboardprint?
#!/bin/bash
echo "Hit a key, then hit return."
read Keypress
case "$Keypress" in
[A-Z] ) echo "Uppercase letter";;
[a-z] ) echo "Lowercase letter";;
[0-9] ) echo "Digit";;
* ) echo "Punctuation, whitespace, or other";;
esac
#!/bin/bash
echo "Hit a key, then hit return."
read Keypress
case "$Keypress" in
[A-Z] ) echo "Uppercase letter";;
[a-z] ) echo "Lowercase letter";;
[0-9] ) echo "Digit";;
* ) echo "Punctuation, whitespace, or other";;
esac