Linux Shell基础
测试环境:CentOS7.0
1、基础命令
1.1查看系统可用的shell
# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
1.2查看用户的默认shell
# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
...
1.3查看本次登录之前执行过的命令
# more .bash_history
1.4Tab键的功能
补全文件名
提示命令名
提示文件名
1.5使用alias定义命令的别名
# alias lm='ls -al'
1.6type命令
# type -a cd
cd is a shellbuiltin
cd is /usr/bin/cd
1.7变量的定义
# var="lang is$LANG"
# echo $var
lang is en_US.UTF-8
# var='lang is$LANG'
# echo $var
lang is $LANG
注意单引号与双引号之间的区别。
# version=$(uname-a)
# echo $version
Linux centos73.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64x86_64 x86_64 GNU/Linux
使用unset命令取消已设置的变量:
# unset version
使变量对于子shell可用:
# export var
看看下面的例子:
# var=abc
# echo $var
abc
# bash #-->进入子shell
# echo $var #-->父shell中定义的变量已经看不到了
# exit #-->退出子shell
exit
# echo $var #-->父shell中变量仍然存在
abc
如果使用export的情况:
# var=abc
# export var
# bash
# echo $var
abc
# exit
exit
# echo $var
abc
当启动一个shell,操作系统会分配一记忆区块给shell使用,此内存内的变量可让子程序使用;
若在父程序利用export功能,可以让自定义变量的内容写到上述的记忆区块当中(环境变量);
当加载另一个shell时,子shell可以将父shell的环境变量所在的记忆区块导入自己的环境变量区块当中。
使用\转义字符可以定义变量内容为特殊符号:
# var="\\"
# echo $var
\
1.8特殊变量
注意$与?是特殊的变量:
$代表当前bash的PID
# echo $$
2371
?代表上一条命令的返回值,0表示上一条命令成功执行,1表示未成功执行
# cd ~
# echo $?
0
# cd /xyz
-bash: cd: /xyz: Nosuch file or directory
# echo $?
1
1.9系统变量
查看机器信息:
# echo $MACHTYPE
x86_64-pc-linux-gnu
env与set:
两个命令都可以用来查看环境变量,区别是未export的变量只能用set查看。
# var1=abc
# var2=def
# export var1
# env | grep var1
var1=abc
# env | grep var2
# set | grep var2
var2=def
查看系统支持的语言和编码:
# locale -a
修改语言编码:
# cat/etc/locale.conf
LANG="en_US.UTF-8"
1.10与用户交互
读取用户输入的命令read:
# read -p "Enterpassword: " -t 3
-t 3 表示等待3秒
1.11变量类型申明
declare与typeset(功能相同):
# declare -isum=100/50
# echo $sum
2
-a:array类型
-i:integer类型
-x:export变量
-r:readonly
1.12数组的使用
定义:
# a=(1 2 3 4 5)
获取数组的长度:
# echo ${#a[@]}
5
获取数组元素:
# echo ${a[2]}
3
# echo ${a[*]}
1 2 3 4 5
赋值:
# a[1]=10
[root@centos7 ~]#echo ${a[*]}
1 10 3 4 5
删除元素:
# unset a[1]
# echo ${#a[*]}
4
也可以使用unseta直接删除整个数组。
分片:
# a=(1 2 3 4 5)
# echo ${a[@]:0:3}
1 2 3
替换:
# a=(1 2 3 4 5)
[root@centos7 ~]#echo ${a[@]/3/100}
1 2 100 4 5
1.13资源限制
查看当前限制:
# ulimit -a
设置限制:
# ulimit -f 10240
1.14变量替换
删除和替换变量中的内容:
${变量#关键词}从头删除内容,由关键词匹配最短字符串
${变量##关键词}从头删除内容,由关键词匹配最长字符串
${变量%关键词}从尾删除内容,由关键词匹配最短字符串
${变量%%关键词}从尾删除内容,由关键词匹配最长字符串
${变量/旧字符串/新字符串}替换第一个匹配
${变量//旧字符串/新字符串}替换所有的匹配
# echo $path
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
# echo ${path#/*:}
/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
# echo $path
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
# echo ${path##/*:}
/root/bin
# echo $path
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
# echo${path%/root*}
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:
# echo ${path%%*bin}
(结果为空)
# echo${path/sbin/sb/}
/usr/local/sb/:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
# echo${path//sbin/sb/}
/usr/local/sb/:/usr/local/bin:/usr/sb/:/usr/bin:/root/bin
变量的替换:
#newvar=${oldvar-null}
# echo $newvar
null
# oldvar=somevalue
#newvar=${oldvar-null}
# echo $newvar
somevalue
new_var=${old_var-content}如果oldz_var已定义,取old_var的值,否则取content的值。
# oldvar=""
#newvar=${oldvar-somevalue}
# echo $newvar
#newvar=${oldvar:-somevalue}
# echo $newvar
somevalue
未设置str str="" str设置为非空
var=${str-expr} var=expr var= var=$str
var=${str:-expr} var=expr var=expr var=$str
var=${str+expr} var= var=expr var=expr
var=${str:+expr} var= var= var=expr
var=${str=expr} str=expr;var=expr str不变;var= str不变;var=$str
var={str:=expr} str=expr;var=expr str=expr;var=expr str不变;var=$str
var=${str?expr} expr输出至stderr var= var=$str
var=${str:?expr} expr输出至stderr expr输出至stderr var=$str
1.15定义命令的别名
定义:
# alias rm='rm -i'
查看:
# alias
取消别名:
# unalias rm
1.16历史命令
# history
# history3(查看前三条历史命令)
# more~/.bash_history(查看历史文件)
# history-w(将当前历史写入历史文件)
# !!(执行上一条命令)
# !vi(执行最近以vi开头的命令)
# !3(执行第三条历史命令)待验证
同一个用户打开多个bash,将只会记录最后一个退出的bash历史命令,因此可以考虑不要同时打开多个bash。
1.17执行指令时的搜索顺序
从相对或绝对路径找->从alias找->从bashbuiltin中找->从$PATH中找
1.18login与non-login
子shell为non-login,执行shell脚本也是non-login。
可以通过命令确认当前shell为login还是non-login。
shopt -q login_shell&& echo 'Login shell' || echo 'Not login shell'
login登录会按照下图依次加载环境变量文件:
/etc/profile ->~.bash_profile
|->/etc/inputrc |-> ~/.bashrc
|->/etc/profile.d/*.sh |->/etc/bashrc
|-> /etc/locale.conf <-|
而non-login会从文件~/.bashrc开始读取。
1.19bash中的通配符
# ll -d /etc/cron*
# ll -d /etc/?????
# ll -d /etc/*[0-9]*
# ll -d /etc/[^a-z]*
1.20命令输出重定向
0、1、2分别代表stdin、stdout、stderr
> 和>> 符号用来将stdout信息输出到文件:
> 将会创建或者覆盖输出文件
>>在输出文件中追加内容而不是覆盖它
1>代表将stdout信息以覆盖的形式重定向
2>>代表将stderr信息以追加的形式重定向
&>代表将stdout和stderr信息重定向
1.21黑洞
/dev/null
移动到该设备的文件以及重定向到该设备的内容将彻底消失。
1.22使用重定向创建文本文件
# cat > testfile< ~/.bashrc
1.23命令的连接
cmd1 ; cmd2直接执行多个互不相关的命令
cmd1 && cmd2前一条命令返回0($?=0表示正常执行)则执行cmd2,否则不执行cmd2
cmd1 || cmd2前一条命令返回非0则执行cmd2,否则不执行cmd2
可以用上面的符号做条件判断:
ls /tmp/vbirding &&echo "exist" || echo "not exist"
1.24对行内容进行分解(cut命令)
-d 指定分隔符
-f 按分隔符取出第几段(field)
-c 按第几个字符分割
例:
# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
# echo $PATH | cut-d : -f 2
/usr/local/bin
# echo $PATH | cut-c 3-5
sr/
1.25抓取包含匹配字符串的行(grep命令)
grep命令参数如下:
-a:将binary文件以text文件的方式搜索
-c:计算找到的行的次数
-i:忽略大小写
-n:顺便输出行号
-v:抓取不包含匹配字符串的行
1.26排序命令:sort,wc,uniq
sort参数
-f 忽略大小写
-b 忽略最前面的空格部分
-M 以月份的名字来排序
-n 使用纯数字来排序
-r 反向排序
-u 相同的行,仅出现一次
-t 分隔符
-k 以指定的区间来排序
例:
# cat /etc/passwd |sort -t ':' -n -k 4
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sync:x:5:0:sync:/sbin:/bin/sync
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
...
以:为分隔符,已第4列按数字排序。
相同的行仅取一次(uniq命令):
uniq选项:
-i:忽略大小写字符的不同
-c:进行计数
例:
# last | cut -d ' '-f 1 | sort | uniq -c
1
11 reboot
18 root
1 wtmp
统计行数,单词数字符数(wc命令):
wc的选项:
-l:统计行数
-w:统计单词数
-m:统计字符数
-c:统计字节数
# wc -m /etc/passwd
909 /etc/passwd
双向重定向命令tee:
生成两份stdout信息,一份到文件一份到screen。
1.27删除或替换内容(tr命令)
tr选项:
-d:删除匹配的字符串
-s:删除重复的字符
# last | tr '[a-z]''[A-Z]'
# last | tr -d ' '
# echo 'abbcdefg' |tr -s 'b'
abcdefg
1.28合并两个文件相同字段的行(join命令)
join选项:
-t:指定分隔符
-i:忽略大小写
-1:第一个文件
-2:第二个文件
例:
join -t ':' -1 4/etc/passwd -2 3 /etc/group
1.29合并两个文件的同一行(paste命令)
paste的选项
-d:可自定义分隔符(默认以[tab]来分隔)
-:如果file部分写成-,表示来自stdin的内容
例:
# cat file1
1
2
3
# cat file2
a
b
c
# paste -d ':' file1file2
1:a
2:b
3:c
1.30将tab转化为空格(expand命令)
例:
# expand -t 1 file
-t 1表示将一个tab转换为一个空格。
1.31创建文件(touch与dd命令)
touch命令:
touch命令可以创建文件和修改文件时间戳:
# touch test
dd命令:
dd命令可以用来创建文件,也可以用来检测磁盘读写速度:
# dd bs=1M count=128if=/dev/zero of=test conv=fdatasync
128+0 records in
128+0 records out
134217728 bytes (134MB) copied, 2.40143 s, 55.9 MB/s
这种方式是先写入缓存,再一次性写入磁盘。
# dd bs=1M count=128if=/dev/zero of=test oflag=dsync
128+0 records in
128+0 records out
134217728 bytes (134MB) copied, 3.08738 s, 43.5 MB/s
这种方式是分128次写入磁盘,基本没有用到缓存。
1.32分割文件(split命令)
split的选项
-b:每个片的大小b,k,m
-l:按行分割
# dd bs=1M count=5if=/dev/zero of=test
5+0 records in
5+0 records out
5242880 bytes (5.2MB) copied, 0.00925931 s, 566 MB/s
# split -b 1M test
# ls
test xaa xab xac xad xae
1.33处理文本行(awk命令)
awk命令的使用:
awk对每一行进行循环
每一行中用分隔符分成多个域,分隔符可以用-F选项定义,如果不定义默认为空格或tab
对于每一个域可以用$N的方式获得其值,例如$1表示第一个域,而$0表示整行记录
awk有很多内部变量,常用的如下:
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行-F选项
NF 浏览记录的域的个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
# cat /etc/passwd |awk -F ':' '{print $1}'
root
bin
daemon
adm
lp
sync
shutdown
以:为分隔符,对于每一行打印出第一个字段。
# awk 'BEGIN{count=0;print "[start]user count is ", count}{count=count+1;print $0;} END{print "[end]user count is ",count}' /etc/passwd
首先定义count并打印一行,然后打印出每一行,最后打印出总行数。
# awk -F ':' '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}'/etc/passwd
对每一行,打印出文件名,行数,列数和行的内容。
1.34将stdin转化为参数(xargs命令)
一些命令不支持通过管道接收stdin,此时需要使用xargs命令将其转化为参数。
xargs默认回车为分隔符,也可以使用-d选项自定义分隔符。
xargs的参数:
-a:从文件中读入作为stdin
-0:遇到特殊字符时,将其当成一般字符
-E:当xargs分析到这个字符串时就停止工作,同时使用-d或-0等情况下会失效
-p:每执行一个argument询问一次用户
-n:定义一次使用几个参数(如果使用此选项,则默认空格和换行为分隔符)
-t:先打印命令,再执行
-d:分隔符
# echo "arg1arg2 arg3 \\" | xargs -t -E 'arg3' echo
echo arg1 arg2
arg1 arg2
# echo "arg1arg2 arg3 \\" | xargs -n1 -t -E 'arg3' echo
echo arg1
arg1
echo arg2
arg2
# cat test
this line1
this line2
# cat test | xargs-t -n3 echo
echo this line1 this
this line1 this
echo line2
line2
1.35压缩和解压(tar命令)
tar的选项:
-x:解压缩文件
-v:显示处理的文件
-f:使用压缩文件
-c:创建一个新的打包文件
-z:以gzip方式压缩,文件名为*.tar.gz
-j:以bzip2方式压缩,文件名为*.tar.bz2
压缩/etc/目录到etc.tar.gz文件:
# tar -zcvfetc.tar.gz /etc
查看压缩文件内容(注意必须加上-z选项):
# tar -ztvfetc.tar.gz
解压文件(同样需要-z选项):
# tar -zxvfetc.tar.gz
2.shell script
2.1交互输入(read命令)
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
read -p "Pleaseinput your first name: " firstname #提示使用者输入
read -p "Pleaseinput your last name: " lastname #提示使用者输入
echo -e "\nYourfull name is: $firstname $lastname" #结果由屏幕输出
2.2使用日期(date命令)
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo -e "I willuse 'touch' command to create 3 files."
read -p "Pleaseinput your filename: " fileuser
#如果fileuser有值且不是空字符串,就取fileuser的值,否则取值"filename"?
filename=${fileuser:-"filename"}
#使用date指令来获得所需要的文件
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"
2.3计算
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo -e "YouSHOULD input 2 numbers, I will cross them! \n"
read -p "firstnumber: " firstnu
read -p "secondnumber: " secnu
#将运算式写在$(())中,即使算式中包含空格也没有问题
total=$(($firstnu*$secnu))
echo -e "\nTheresult of $firstnu x $secnu is ==> $total"
2.4脚本执行方式的区别
sh执行脚本时,脚本是在子bash中执行。
source执行脚本时,脚本是在父bash中执行。
2.5判断(test命令)
# test -e /dmtsai &&echo "exist" || echo "Not exist"
Not exist
判断为“是”返回0,判断为“非”返回1
-e 该『档名』是否存在?(常用)
-f该『档名』是否存在且为文件(file)?(常用)
-d该『文件名』是否存在且为目录(directory)?(常用)
-b 该『档名』是否存在且为一个block device装置?
-c 该『档名』是否存在且为一个character device装置?
-S 该『档名』是否存在且为一个Socket文件?
-p 该『档名』是否存在且为一个FIFO (pipe)文件?
-L该『档名』是否存在且为一个连结文件?
-r该档名是否存在且具有『可读』的权限?
-w该档名是否存在且具有『可写』的权限?
-x该档名是否存在且具有『可执行』的权限?
-u该文件名是否存在且具有『SUID』的属性?
-g该文件名是否存在且具有『SGID』的属性?
-k该文件名是否存在且具有『Stickybit』的属性?
-s 该档名是否存在且为『非空文件』?
-nt (newerthan)file1 是否比file2 新
-ot (olderthan)file1 是否比file2 旧
-ef 判断file1与file2是否为同一档案,可用在判断hardlink的判定上。主要意义在判定,两个档案是否均指向同一个inode
-eq 两数值相等(equal)
-ne 两数值不等(not equal)
-gt n1 大于n2 (greater than)
-lt n1 小于n2 (less than)
-ge n1 大于等于n2 (greater than or equal)
-le n1 小于等于n2 (less than or equal)
test -z string判断string为空字符串
test -n string判断string为非空字符串
注:-n亦可省略
test str1 = str2 判断str1 是否等于str2
test str1 != str2 刞定str1 是否不等于str2
-a (and)两状况同时成立!例如test -r file -a -x file
-o (or)两状况任何一个成立!例如test -r file -o -x file
! 反相状态,如test ! -x file
例(判断文件是否存在,并打印出文件类型以及权限):
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
read -p "Inputa filename" filename
test -z $filename &&echo "You MUST input a filename." && exit 0
test ! -e $filename&& echo "The filename '$filename' DO NOT exist" &&exit 0
test -f $filename &&filetype="regulare file"
test -d $filename &&filetype="directory"
test -r $filename &&perm="readable"
test -w $filename &&perm="$perm writable"
test -e $filename &&perm="$perm executable"
echo "Thefilename: $filename is a $filetype"
echo "And thepermissions are:$perm"
2.6判断符号[]
判断变量$HOME是否为空
# echo $HOME
/root
# [ -z "$HOME"] ; echo $?
1
注意:
在中括号[]内的每个组件都需要有空格键来分隔;
在中括号内的变量,最好都以双引号括号起来;
在中括号内的常数,最好都以单或双引号括号起来。
2.7shell脚本中的预设变量
$0 :代表脚本文件名;
$# :代表脚本后接的参数个数;
$@ :代表"$1""$2" "$3" "$4"...的意思,每个变量是独立的(用双引号括起来);
$*:代表"$1c$2c$3c$4",其中c为分隔字符,默认空格键。
例:
# cat test.sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo "Thescript name is ==> $0"
echo "Totalparameter number is ==> $#"
[ "$#" -lt2 ] && echo "The number of parameter is less than 2.Stop here." && exit 0
echo "Yourwhole parameter is ==> '$@'"
echo "The 1stparameter ==> $1"
echo "THe 2ndparameter ==> $2"
# sh test.sh i youhe
The script name is==> test.sh
Total parameternumber is ==> 3
Your whole parameteris ==> 'i you he'
The 1st parameter==> i
THe 2nd parameter==> you
2.8参数偏移(shift命令)
例:
# cat test.sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo "Totalparameter number is ==> $#"
echo "Yourwhole parameter is ==> $@"
echo "Yourfirst paramter is ==> $1"
shift
echo "Parametershave been shifted."
echo "Totalparameter number is ==> $#"
echo "Yourwhole parameter is ==> $@"
echo "Yourfirst paramter is ==> $1"
# sh test.sh onetwo three
Total parameternumber is ==> 3
Your whole parameteris ==> one two three
Your first paramteris ==> one
Parameters have beenshifted.
Total parameternumber is ==> 2
Your whole parameteris ==> two three
Your first paramteris ==> two
2.9条件判断(if语句)
if … ; then
...
fi
例:
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
read -p "Pleaseinput (Y/N): " yn
if [ "$yn"== "Y" ] || [ "$yn" == "y" ]; then
echo "OK,continue"
exit 0
fi
if [ "$yn"== "N" ] || [ "$yn" == "n" ]; then
echo "Oh,interrupt!"
exit 0
fi
echo "I don'tknow what your choice is" && exit 0
if …; then
…
elif …; then
…
else
…
fi
例:
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
read -p "Pleaseinput (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'tknow what your choice is"
fi
例:
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo "Thisprogram will try to calculate :"
echo "How manydays before your demobilization date..."
read -p "Pleaseinput your demobilization date (YYYYMMDD ex>20090401): "date2
date_d=$(echo $date2|grep '[0-9]\{8\}') #看看是否有八个数字
if [ "$date_d"== "" ]; then
echo "You inputthe wrong date format...."
exit 1
fi
declare -idate_dem=`date --date="$date2" +%s`
declare -idate_now=`date +%s`
declare -idate_total_s=$(($date_dem-$date_now))
declare -idate_d=$(($date_total_s/60/60/24))
if [ "$date_total_s"-lt "0" ]; then
echo "You hadbeen demobilization before: " $((-1*$date_d)) " ago"
else
declare -idate_h=$(($(($date_total_s-$date_d*60*60*24))/60/60))
echo "You willdemobilize after $date_d days and $date_h hours."
fi
2.10条件判断(caseesac语句)
case … in
…)
;;
esac
例(只接受参数为one/two/three):
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
case $1 in
"one")
echo "Yourchoice is ONE"
;;
"two")
echo "Yourchoice is TWO"
;;
"three")
echo "Yourchoice is THREE"
;;
*)
echo "Usage$0 {one|two|tree}"
;;
esac
2.11使用函数(function)
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
function printit(){
echo "Yourchoice is $1"
}
case $1 in
"one")
printit 1
;;
"two")
printit 2
;;
"three")
printit 3
;;
*)
echo "Usage$0 {one|two|tree}"
;;
esac
注意函数定义中的$1表示函数内部参数,而不是脚本的参数。
2.22循环
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
while [ "$yn"!= "yes" -a "$yn" != "YES" ]
do
read -p "Pleaseinput yes/YES:" yn
done
echo "OK! youinput the corrent answer."
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
until [ "$yn"== "yes" -o "$yn" == "YES" ]
do
read -p "Pleaseinput yes/YES to stop this program: " yn
done
echo "OK! youinput the correct answer."
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
s=0
i=0
while [ "$i"!= "100" ]
do
i=$(($i+1))
s=$(($s+$i))
done
echo "Theresult of '1+2+3+...+100' is ==> $s"
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
for animal in dogcat elephant
do
echo "There are${animal}s.... "
done
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
users=$(cut -d ':'-f1 /etc/passwd)
for username in$users
do
id $username
finger $username
done
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
network="192.168.1"
for sitenu in $(seq1 100)
do
ping -c 1 -w 1${network}.${sitenu} &> /dev/null && result=0 ||result=1
if [ "$result"== 0 ]; then
echo "Server${network}.${sitenu} is UP."
else
echo "Server${network}.${sitenu} is DOWN."
fi
done
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
read -p "Pleaseinput a directory: " dir
if [ "$dir"== "" -o ! -d "$dir" ]; then
echo "The $diris NOT exist in your system."
exit 1
fi
filelist=$(ls $dir)
for filename in$filelist
do
perm=""
test -r"$dir/$filename" && perm="$perm readable"
test -w"$dir/$filename" && perm="$perm writable"
test -x"$dir/$filename" && perm="$perm executable"
echo "The file$dir/$filename's permission is $perm "
done
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
read -p "Pleaseinput a number, I will count for 1+2+...+your_input: " nu
s=0
for (( i=1; i<=$nu;i=i+1 ))
do
s=$(($s+$i))
done
echo "Theresult of '1+2+3+...+$nu' is ==> $s"
2.23脚本的调试与debug
sh命令的选项:
-n:不执行脚本,仅查看是否有语法错误,没有输出表示无语法错误。
-x:执行脚本,并列出全部执行过程。
-v:执行之前,现将脚本内容输出到屏幕上。