前段时间因为要往一个文件写入一系列随机数给大家用,自己用C语言写了一个,把源文件发给大家,然后大家还要编译,运行,有时候里面的代码需要修改重新编译运行,很是麻烦,其实这些都可以用简单的Shell Scripts来完成。
来看第一个程序,sh01.sh:显示"Hello World!"
#!/bin/bash #这个一行在宣告这个script使用的shell名称,因为我们用的是bash,所以这么写。除了的[#!]这一行是用来宣告shell之外,其他的#都是[批注] #program: # This program shows "hello world!" in your screen #History: # 2013/6/28 Leaguenew First release PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH echo -e "Hello World! \a \n" exit 0
脚本的执行:1.sh sh01.sh;2.chmod a+x sh01.sh ; ./sh01.sh ;
执行结果:
为了代码清晰简单,下面的代码就省去了对程序功能的介绍,历史版本,设置PATH等。
sh02.sh--通过read -p命令来通过terminal和用户交互,输入信息等;
#!/bin/bash read -p "please input your first name: " firstname #for user to input read -p "please input your last name: " lastname #for user to input echo -e "\nyour full name is : $firstname $lastname " #show the result执行结果:
sh03.sh--输入文件名filename,通过date生成文件名为当天,前一天,前两天的文件。
#!/bin/bash echo -e "I will use 'touch' command to create 3 files." #显示信息 read -p "Please input your filename: " fileuser #提示使用者输入 date1=$(date --date='2 days ago' +%Y_%m_%d) #前两天的日期 date2=$(date --date='1 days ago' +%Y_%m_%d) #前一天的日期 date3=$(date +%Y_%m_%d) #今天的日期 file1=${filename}${date1} #以下三行设定档名 file2=${filename}${date2} file3=${filename}${date3} touch "$file1" #建立文档 touch "$file2" touch "$file3"运行结果:
sh04.sh--利用$((计算式))来进行数值运算,输入两个变量,输出相乘的结果:
#!/bin/bash read -p "please input the first number:" firstnum #依次输入两个值 read -p "please input the second number:" secondnum declare -i total=$firstnum*$secondnum #计算结果 echo -e "the result is ==> $total"输出结果:
介绍一下script针对参数设定的变量名称:
比如执行一条命令:./script.sh opt1 opt2 opt3 opt4
$0 $1 $2 $3 $4
执行的脚本明为$0这个变量,接着第一个参数相当于$1...相当于C语言中执行:./a.out argv[1] argv[2] argv[3]
$# :代表后接的参数『个数』,以上表为例这里显示为『4 』;
$@ :代表『"$1" "$2" "$3" "$4" 』之意,每个变量是独立的(用双引号括起来);
$* :代表『"$1c$2c$3c$4" 』,其中c 为分隔字符,预设为空格键, 所以本例中代表『"$1
$2 $3 $4" 』之意。
sh07:
#!/bin/bash echo "The script name is ==> $0" #文件名 echo "Total parameter number is ==> $#" #打印参数个数 [ "$#" -lt 2 ] && echo "The number of parameter si less than 2. stop here." && exit 0 echo "Your whole parameter is ==> '$@' " #打印全部参数 echo "The 1st parameter ==> $1 "<span style="white-space:pre"> </span> echo "The 2st parameter ==> $2 " echo "The 3st parameter ==> $3 "<strong> </strong>运行结果:
下面介绍一下条件判断式:if......then......fi
sh06-2.sh--通过用户的输入判断是y/Y还是n/N,还是都不是:
#!/bin/bash read -p "Please input (Y/N) : " yn if [ "$yn" == "Y" -o "$yn" == "y" ] ; then #判断输入的是Y/y,如果是的话,输出:OK,continue echo "OK , continue" exit 0 fi if [ "$yn" == "N" -o "$yn" == "n" ] ; then #判断输入的是N/n,如果是的话,输出:Oh,interrupt! echo "Oh , interrupt!" exit 0 fi echo "I don't know what your choice is" && exit 0 #如果以上两个条件都不成立,那么输出。。。
if[ 体检判断式 ] ; then
当条件判断式成立时,可以进行的指令工作内容;
else
当条件判断式不成立时,可以进行的指令工作内容;
fi
还有if...elif...elif...else
if[ 条件判断式一 ] ; then
当条件判断式一成立时,可以进行的指令工作内容;
elif[ 条件判断式二 ] ; then
当条件判断式二成立时,可以进行的指令工作内容;
else
当条件判断式二成立时,可以进行的指令工作内容;
fi
#!/bin/bash read -p "Please input (Y/N) : " yn if [ "$yn" == "Y" ] || [ "$yn" == "y" ] ; then echo "OK , continue" elif [ "$yn" == "N" ] || [ "$yn" == "n" ] ; then echo "Oh , interrupt!" else echo "I don't know what your choice is" fi
语法形式:
case $变量名称in <==关键词为case ,还有变数前有钱字号
"第一个变量内容") <==每个变量内容建议用双引号括起来,关键词则为小括号)
程序段
;; <==每个类别结尾使用两个连续的分号来处理!
"第二个变量内容")
程序段
;;
*) <==最后一个变量内容都会用* 来代表所有其它值
不包含第一个变量内容与第二个变量内容的其它程序执行段
exit 1
;;
esac <==最终的case 结尾!『反过来写』思考一下!
sh12.sh--判断输入的参数是one , two , three :
#!/bin/bash echo "This program will print your selection!" read -p "Input your choice:" choice case $choice in "one") echo "Your choice is one" ;; "two") echo "Your choice is two" ;; "three") echo "Your choice is three" ;; *) echo "Your choice should be one/two/three" ;; esac
利用function功能:
sh12-3.sh:
#!/bin/bash function printit() { echo "Your choice is $1" } echo "This program will print your selection!" read -p "Input your choice:" choice case $choice in "one") printit $choice; ;; "two") printit $choice; ;; "three") printit $choice; ;; *) echo "Your choice should be one/two/three" ;; esac<strong> </strong>
while [ condition ] <==中括号内的状态就是判断式,当condition成立一直循环。
do <==do 是循环的开始!
程序段落
done <==done 是循环的结束
until [ condition ] <==当condition成立,终止循环。
do
程序段落
done
sh14.sh--计算1+2+3...+100:
#!/bin/bash s=0 i=0 while [ "$i" != "100" ] do i=$(($i+1)) # $((计算表达式)) s=$(($s+$i)) done echo "The result of '1+2+3..100' is ==> $s "
for...do...done(固定循环):
语法一:
for var in con1 con2 con3 ...
do
程序段
done
sh15.sh:
#!/bin/bash for animal in dog cat elephant do echo "There are ${animal}s" done运行结果:
语法二:
for...do...done的数值处理:
for (( 初始值; 限制值; 执行步阶))
do
程序段
done
sh19.sh:根据你的输入数值n来从1加到n:
#!/bin/bash read -p "please input a number , I wil count for 1+2..+your_input:" nu s=0 for ((i=1;i<=$nu;i++)) do s=$(($s+$i)) done echo "The result of '1+2..$nu' is ==> $s"执行结果:
sh20.sh:创建文件和删除文件:
将下面两句命令转换成为代码:
touch file{0..9} rm -rf file{0..9}将问题复杂化:
#!/bin/bash function create_file() { touch file{0..9} } function delete_file() { for i in {0..9} do rm -rf file${i} #string connect echo "remove file $i" done } create_file delete_file
sh21.sh:获取shell ip
<pre name="code" class="python">#!/bin/bash ip="$(ifconfig | grep -A 1 'eth0' | tail -1 | cut -d ":" -f 2 | cut -d ' ' -f 1)" echo $ip
总结:
· shell script 是利用shell 的功能所写的一个『程序(program)』,这个程序是使用纯文字文件,将一些shell 的语法与指令(含外部指令)写在里面, 搭配正规表示法、管线命令与数据流重导向等功能,以达到我们所想要的处理目的
· 在Shell script 的档案中,指令的执行是从上而下、从左而右的分析与执行;
· shell script 的执行,至少需要有r 的权限,若需要直接指令下达,则需要拥有r 与x 的权限;
· 良好的程序撰写习惯中,第一行要宣告shell (#!/bin/bash) ,第二行以后则宣告程序用途、版本、作者等
· 对谈式脚本可用read 指令达成;
· 要建立每次执行脚本都有不同结果的数据,可使用date 指令利用日期达成;
· script 的执行若以source 来执行时,代表在父程序的bash 内执行之意!
· 在script 内,$0, $1, $2..., $@ 是有特殊意义的!
· 条件判断式可使用if...then 来判断,若是固定变量内容的情况下,可使用case $var in ...esac 来处理
· 循环主要分为不定循环(while, until) 以及固定循环(for) ,配合do, done 来达成所需任务!
现在完成一个任务:就是给定一组人的姓名(abc,def,ghi,jkl),输入一个数n,得到一个文件,文件内容为:
1,abc
2,jkl
3,def
。。。
等;
代码:
#!/bin/bash read -p "please input the number of loops : " n locations=(Shanghai Beijing Suzhou Wuxi Xuzhou) #设置数组locations,其中有五个元素,每个元素都是字符串的名字 num=${#locations[*]} # "<span style="font-family: Arial, Helvetica, sans-serif;">#locations[*] “</span>代表数组元素的数量 for ((i=1;i<=$n;i=i+1)) do echo "$i , ${locations[($RANDOM)%($num)]}" >> filename # "<span style="font-family: Arial, Helvetica, sans-serif;">$RANDOM</span>"是linux自带的系统随机数变量 done<strong> </strong>执行结果:
至此,最最简单的shell scripts编写方法就到这里了,shell的功能十分强大,能提高我们的工作效率,所以如果要进一步学习还有很长的路走。
转载请注明:http://blog.csdn.net/lavorange/article/details/9631759