<>Linux shell脚本练习题汇总
*
编写脚本文件example1.sh,存放在/home/cauc/scripts目录下。脚本功能为:查找某文件是否存在(以参数形式),若存在,则将其权限设置为用户主可读可改,其他人无任何权限。否则则返回无此文件的信息。
#!/bin/bash if [ -e $1 ] then chmod 600 $1 else echo "The file $1 does not
exist" fi
* 编写脚本文件leapyear.sh,存放在/home/cauc/scripts目录下。脚本功能为:判断给定的某一年是否是闰年。 #!/bin/bash
echo "Input a year number:" read year let "leap=$year%4==0&&$year%100!=0||$year
%400==0" if [ $leap -eq 0 ] then echo "$year is not a leap year" else echo "
$year is a leap year" fi
* 打印给定行数的*号。第一行打印1个,第二行打印2个,等等。行数由用户在命令行上输入。 #!/bin/bash for((i=0;i<$1;i++))
do for((j=0;j<=i;j++)) do echo -n "*" done echo "" done
* 编写脚本文件sum.sh,存放在/home/cauc/scripts目录下。脚本功能为:计算从1加到100的和并返回结果。 #!/bin/bash s=
0 for((i=0;i<=100;i++)) do s=$(($s+$i)); done echo "the sum is:$s"
* 编写 shell脚本,参数为一个大于 20 的正整数。先检查参数是否符合要求。如果不
符合要求,请给出提示;如果符合要求,输出这个参数的平方。 #!/bin/bash if [ $1 -gt 20 ] then echo "$(($1*$1
))" else echo "number is wrong" fi
* 编写 shell脚本, 首先显示当天日期, 然后查找给定的用户是否在系统中工作(who 命令)。 如果在系统中,就输出一条欢迎语句(例如 hello,
****!);如果不在系统中,就输出一条语句(waiting for ***!) #!/bin/bash date if who|grep "^$1" then
echo "hello,$1!" else echo "waiting for $1!" fi
* 编写 shell脚本,该脚本接受一个参数。 若给定参数不是目录, 则给出提示信息;
否则使用 ll 命令列出该目录下的内容,并输出有多少个子目录(d 开头),多少个普通文件(-开头)。 #!/bin/bash if [ -d $1 ]
then ls -l $1 echo -n "d:" ls -l $1|grep "^d"|wc -l echo -n "-:" ls -l $1|grep
"^-"|wc -l else echo "$1 does not existence" fi
* 编写shell脚本, 将第一个参数指定的内容 copy 到第二个参数指定地点。
若第一个参数是目录, 自动添加-r 选项(即把目录下的所有内容都 copy 过去);
若第一个参数是普通文件,则将其 copy 到指定地点;
若第一个参数指定的文件或目录不存在,则报错;
若第二个参数指定的文件或目录已经存在,则提示是否替换,若选择 yes,则先删除原来的文件或目录, 然后再执行 copy 操作, 否则放弃。
#!/bin/bash if [ -e $1 ] then if [ -e $2 ] then echo "replace?[yes/no]" read ans
if [ $ans=="yes" ] then if [ -d $1 ] then cp -r $1 $2 else cp $1 $2 fi fi else
if [ -d $1 ] then cp -r $1 $2 else cp $1 $2 fi fi else echo "error!" fi
* 编写 shell脚本。 检查命令行的第一个参数是否是-b 或者-s。 如果是-b,则计算由
第二个参数指定的文件中以 b 开头的行数。如果是-s,则计算由第二个参数指定的文件中
以 s 开头的行数。 否则显示选择有错的信息。 #!/bin/bash case $1 in -b) count = `grep ^b $2 | wc -l
` echo “The number of lines in $2 that start with b is $count.”;; -s) count = `
grep ^s $2 | wc -l` echo “The number of lines in $2 that start with s is $count
.”;; *) echo “Theoption is not recognized”;; esac
* 编写shell脚本。 该脚本需要输入两个文件的名称, 然后由用户选择相应的操作(若
两个参数中任何一个不是普通文件, 则报错):
cat: 输出两个文件的内容;
statistic: 统计两个文件分别有多少行
merge:将第 1 个文件的内容合并到第 2 个文件后面;
copy:将第 1 个文件的内容 copy 到第 2 个文件(第 2 个文件原有内容被覆盖);
bye:退出。 #!/bin/bash if [[ -f $1 && -f $2 ]] then echo “please chose your cat,
statistic, merge, copy, or bye.”read chose case $chose in cat) cat $1 $2;;
statistic) echo `wc -l $1` echo `wc -l $2`;; merge) cat $1 >> $2;; copy) cat $1
> $2;; bye) break;; esac else echo "$1 or $2 is not file" fi
* 编写 shell脚本, 利用 for 循环将当前目录下的.c 文件移动到指定的目录下, 完成
后显示指定目录下的文件内容, 并按文件从小到大排序。 (ll -r -S) #!/bin/bash for i in `ls|grep -E "*.c"`
do mv $i $1 done ls -l -r -S $1
* 编写 shell脚本, 显示 Fibonacci 数列的前 10 项及其总和。 #!/bin/bash a=1 b=1 sum=2 cnt=4 echo
-n -e"$a\t$b" while [ $cnt -gt 0 ] do let "a=a+b" let "b=a+b" let "sum=sum+a+b"
let "cnt=cnt-1" echo -n -e "\t$a\t$b" done echo "" echo "sum=$sum"
* 编写shell脚本, 判断给定的参数是否是素数。(假定大于2) #!/bin/bash flag=0 if for (( i=2; i<=$1/2;i
++ )) do if (($1%i==0)) then flag=1 break fi done if [ flag -eq 1 ] then echo $1
is not a prime numberelse echo $1 is a prime number fi
14)编写shell脚本,将给定的参数转换成二进制表示。
#!/bin/bash a=0 b=$1 c=1 sum=0 while [ $b -gt 0 ] do let "a=b%2" let "b=b/2"
let "sum=sum+a*c" let "c=c*10" done echo "$sum"
* 假设存在一个的文件夹(作为参数), 其中包含一个 studentlist.csv 的文件,当
中存放了若干学生的学号,每个一行。 例如:
150341101
150341102
150341105
150341106
编写shell脚本,查看/homework 文件夹下学生是否提交了作业, 假设作业名的格式为:学号_homework.txt。最后输出没提交作业的学号名单。
#!/bin/bash cd $1 for i in `cat studentlist.csv` do str="_homework.txt" file=$i
$str if [ -f $file ] then echo "$i yes" else echo "$i no" fi done
有不同意见欢迎留言讨论!