首页 > 技术文章 > shell基础笔记1

as007012 2018-11-22 18:26 原文

---恢复内容开始---

1 test命令中不能使用浮点小数值,如:

   A=1.444444;[    $A -gt 1  ]
2 test命令中的>或<必须转义,否则shell会把它们当做重定向符号而把字符串当做文件名来创建,如:[   $A  \>  $B  ]
3 在test命令中大写字母会被当成小于小写字母的,这与sort命令相反。
4 复合条件测试,如:
[ -d  /etc  ]  && [  -f  /etc/passwd  ] 
[  -d /etc  -a   -f  /etc/passwd  ]
[[  -d /etc  &&   -f  /etc/passwd  ]]
 
[  -d  /etc  ]  || [  -f /etc/passwd  ]
[[  -d  /etc  ||  -f  /etc/passwd  ]]
[  -d /etc  -o  -f  /etc/passwd  ]
 
5 if-then语句的高级特性:用于数学表达式的"(( ))";用于高级字符串处理功能(模式匹配)的"[[ ]]"
 
6 for语句都去列表中的复杂值
shell看到了列表之中的单引号并尝试使用他们来定义一个单独的数据值,造成混乱,解决办法:1使用\将单引号转义;2使用双引号来定义用到单引号的值,如:for test in I don\'t  know if  "this'll"  work
如果变量的取值包含空格,要容纳这种值,应将变量用双引号括起来,如:if   [   -f    "$test"   ]
 
c语言风格的for循环:for  ((i=1;i<=10;i++))
                                     do
                                              commands
                                     done
                                     for  ((a=1,b=10;a<=10;a++,b--))
                                      do
                                              commands
                                      done  
 
 
7 命令行参数: $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} 最后一个参数变量值${!#};
$*变量会将所有命令行参数当成一个整体的单个参数,而$@变量会单独处理命令行每个参数。
 
8 echo   -e "\a"       (哗哗声)
    内部变量:计算脚本执行时长$SECONDS
 
9 selsect
select 表达式是一种bash的扩展应用,尤其擅长于交互式使用。用户可以从一组不同的值中进行选择。 
select var in ... ; do 
break 

done 
.... now $var can be used ....

例子: 
 

#!/bin/sh 
echo "What is your favourite OS?" 
select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do 
break 
done 
echo "You have selected $var"

该脚本运行结果: 
What is your favourite OS? 
1) Linux 
2) Gnu Hurd 
3) Free BSD 
4) Other 
#? 1 
You have selected Linux
注意:select是扩展应用。


来源: <http://www.jbxue.com/article/31438.html>
 
10  SECONDS  当前运行的bash进程的运行时间(以秒为单位)
11  在同一行里用空白字符隔开为多个变量赋值是可以的。
如果给变量赋的值中有空白字符,引号是必须的。
从字符串的右边结尾处提取?echo ${stringZ:  -4}

12 子串替换:

${string/substring/replacement}

用$replacement替换由$substring匹配的字符串。

${string//substring/replacement}

用$replacement替换所有匹配$substring的字符串。

 

   1 stringZ=abcABC123ABCabc
   2 
   3 echo ${stringZ/abc/xyz}           # xyzABC123ABCabc
   4                                   #用'xyz'代替第一个匹配的'abc'.
   5 
   6 echo ${stringZ//abc/xyz}          # xyzABC123ABCxyz
   7                                   # 用'xyz'代替所有的'abc'.

 

${string/#substring/replacement}

如果$string字符串的最前端匹配$substring字符串,用$replacement替换$substring.

${string/%substring/replacement}

如果$string字符串的最后端匹配$substring字符串,用$replacement替换$substring.

 

   1 stringZ=abcABC123ABCabc
   2 
   3 echo ${stringZ/#abc/XYZ}          # XYZABC123ABCabc
   4                                   # 用'XYZ'替换前端的'abc'.
   5 
   6 echo ${stringZ/%abc/XYZ}          # abcABC123ABCXYZ
   7                                   # 用'XYZ'替换后端的'abc'.

 

 

来源: <http://manual.51yip.com/shell/string-manipulation.html>
  
13   while (( a <= LIMIT )) # 双圆括号, 变量前边没有"$".
14  生成指定范围的随机数和字符串,脚本如下:
#!/bin/bash  
count=$[$2-$1+1]
#num=$(date +%s%N)
echo $[$RANDOM%$count+$1]
 
#使用date 生成随机字符串  
date +%s%N | md5sum | head -c 10 
#使用 /dev/urandom 生成随机字符串  
cat /dev/urandom | head -n 10 | md5sum[cksum] | head -c 10
#使用命令expect包提供的复杂密码生成工具mkpasswd
#echo $RANDOM | md5sum
 
15 wc -c 命令计算字符长度时会加上单词间空格,制表符,换行符
16  date -d "1 day ago" +'%Y-%m-%d' 或 date --date="1 day ago" +'%Y-%m-%d'
      date -d "10 day ago" +'%Y-%m-%d'
      date -d "1 month ago" +'%Y-%m-%d'
      date -d "1 year ago" +'%Y-%m-%d'
 
17 command1 || {
                            command2;command3;......
                             }
 
 
18  if  command1;command2;command...
         then
                 ....
      fi

19 case特例

a=2
case "$a" in
1)
  echo 1
  ;;
2)
  :
  ;;
*)
  echo "*"
  ;;
esac
 

20  shell变量的子串应用技术

shell中截取字符串的方法有很多中,
${expression}一共有9种使用方法。
${parameter:-word}当变量未定义或者值为空时,返回值为word的内容,否则返回变量的值.
${parameter:=word}与前者类似,只是若变量未定义或者值为空时,在返回word的值的同时将
  word赋值给变量。 ${parameter:?word}若变量以赋值的话,正常替换.否则将消息message送到标准错误输出(若
  此替换出现在Shell程序中,那么该程序将终止运行) ${parameter:+word} 若变量以赋值的话,其值才用word替换,否则不进行任何替换。 上面4种可以用来进行缺省值的替换。 ${#parameter} 上面这种可以获得字符串的长度。 ${parameter%word} 最小限度从后面截取word ${parameter%%word} 最大限度从后面截取word ${parameter#word} 最小限度从前面截取word ${parameter##word} 最大限度从前面截取word
${parameter/string/replace}从左往右第一个匹配的string进行替换
${parameter//string/replace}从左往右所有匹配string的进行替换
上面4个就是用来截取字符串的方法了。 有了着四种用法就不必使用cut命令来截取字符串了 第一种又可以分为四种情况,下面一一介绍。 1、使用 # 号操作符。用途是从左边开始删除第一次出现子字符串即其左边字符,保留右边字符。用法为#*substr,例如: str='http://www.你的域名.com/cut-string.html' echo ${str#*//} 得到的结果为www.你的域名.com/cut-string.html,即删除从左边开始到第一个"//"及其左边所有字符2、使用 ## 号操作符。用途是从左边开始删除最后一次出现子字符串即其左边字符,保留右边字符。用法为##*substr,例如: str='http://www.你的域名.com/cut-string.html' echo ${str##*/} 得到的结果为cut-string.html,即删除最后出现的"/"及其左边所有字符 3、使用 % 号操作符。用途是从右边开始删除第一次出现子字符串即其右边字符,保留左边字符。用法为%substr*,例如: str='http://www.你的域名.com/cut-string.html' echo ${str%/*} 得到的结果为http://www.你的域名.com,即删除从右边开始到第一个"/"及其右边所有字符 4、使用 %% 号操作符。用途是从右边开始删除最后一次出现子字符串即其右边字符,保留左边字符。用法为%%substr*,例如: str='http://www.你的域名.com/cut-string.html' echo ${str%%/*} 得到的结果为http: ,即删除从右边开始到最后一个"/"及其右边所有字符 第二种也分为四种,分别介绍如下: 1、从左边第几个字符开始以及字符的个数,用法为:start:len,例如: str='http://www.你的域名.com/cut-string.html' echo ${var:0:5} 其中的 0 表示左边第一个字符开始,5 表示字符的总个数。 结果是:http: 2、从左边第几个字符开始一直到结束,用法为:start,例如: str='http://www.你的域名.com/cut-string.html' echo ${var:7} 其中的 7 表示左边第8个字符开始 结果是:www.你的域名.com/cut-string.html 3、从右边第几个字符开始以及字符的个数,用法:-start:len,例如: str='http://www.你的域名.com/cut-string.html' echo ${str:-15:10} 其中的 -15 表示右边算起第15个字符开始,10 表示字符的个数。 结果是:cut-string 3、从右边第几个字符开始一直到结束,用法:0-start,例如: str='http://www.你的域名.com/cut-string.html' echo ${str:-4} 其中的 -4 表示右边算起第4个字符开始。 结果是:html 注:(左边的第一个字符是用 0 表示,右边的第一个字符用 -1 表示)
 
附:
$? 上条命令的执行结果
$$ 脚本运行的进程号
$! 最近一条在后台运行命令的PID号
$_ 上一条命令的最后一个参数
$* 把命令行所有参数视为一个字符串整体
$@ 把命令行每个参数视为单独的个体区分。具体区别可在for循环中体现。
 

21 老男孩shell笔记

1. 双括号(())运算案列
root@master ~]# ./1.sh  1+3
4
[root@master ~]# cat 1.sh
#!/bin/bash
echo $[$1$2$3]
2. #echo $((a++))先打印变量a的值,再做运算。
    #echo $((++a))先做运算,再打印变量a的值。
3.写法1  [ 3 -ne 3 ]  ||  {  命令1 ; 命令2 ; 命令3 ;  }        #大括号旁边得有空格
   写法2  [ 3 -ne 3 ]  || {
                       命令1;
                       命令2;
                       命令3;
                   }
 
4 命令行参数 $1 $2 $3 $4 $5 。。。$9 ${10} ${11} 。。。
   最后一个参数可表示为${!#}
 
5  [[ $a == z* ]] # 如果$a以"z"开头(模式匹配)那么结果将为真
 [[ $a == "z*" ]]  # 如果$a与z*相等(就是字面意思完全一样), 那么结果为真.

6 select语句 脚本示例:
echo what is your os type?
select os in "linux" "unix" "windows" "quit"
do

case "$os" in   
"linux") echo your os is "$os";;
"unix")  echo your os is "$os";;
"windows") echo your os is "$os";;
"quit")  exit;; 
*)continue;;
esac

break   
done
7 [[ condition1 && condition2 ]] 或 [ condition1   ]  &&  [  condition2    ]
    [[ condition1 || condition2 ]] 或 [ condition1   ]  ||  [  condition2    ]
   [ condition1 -a condition2  ] 或 [ condition1   ]  &&  [  condition2    ]
       [ condition1 -o condition2  ] 或 [ condition1   ]  ||  [  condition2    ]
 8 if  [ "$string1" = "$string2" ]
  # if [ "X$string1" = "X$string2" ] 是一种更安全的做法,
  # 这样可以防止两个变量中的一个为空所产生的错误.
  # (字符"X"作为前缀在等式两边是可以相互抵消的.) 
   then
      command
   fi
9 间接引用变量:[root@localhost ~]# a=b
[root@localhost ~]# b=c
[root@localhost ~]# echo ${!a}
c
10 获取web访问状态码:curl -o /dev/null -s -w %{http_code} http://www.baidu.com
11 awk 'BEGIN{print (3>2)?1:4}' 小括号省略报错。
12 mail -s "hello,dingzhao"  dingzhao@xywy.com << !
   XXXXXXXXX.............
   !
13 awk '{$2=$2"|";print $NF ~ /PASSED/ ? "ges|info|"$0 : "ges|error|"$0}'



22 BASH脚本字符串分片

BASH脚本重访变量:
1、bash的内置变量:全大写
PATH、PS1、HOSTNAME、UID、HISTFILE、HISTSIZE、HISTFILESIZE、HISTCONTROL
 
$BASH: bash二进制程序文件的路径
$BASH_SUBSHELL: 子shell的层次
$BASH_VERSION: 
 
$EDITOR: 默认编辑器
 
$EUID: 有效的用户ID
$UID: 用户的ID号
 
$FUNCNAME: 当前函数的名称
 
$GROUPS: 当前用户所属的组
 
$HOME: 当前用户的家目录
 
$HOSTTYPE:主机类型,用来识别系统硬件
$MACHTYPE:平台类型
$OSTYPE: OS类型
 
$OLDPWD
$PWD
 
$IFS:输入数据时字段分隔符,默认为空白符(空格、制表符、换行符)
 
$PPID
 
$PS1: 主提示符
$PS2:第二提示符,补充完全命令输入时的提示符
$PS3: 第三提示符,用于select命令中
$PS4:第四提示符,当使用-x选项调用脚本时,显示的提示符,默认为+号
 
$SECONDS: 当前脚本已经运行的时长
 
$SHLVL: shell级别,bash被嵌入的深度
 
2、特殊变量
$0: 脚本名称自身
$1, $2, ...: 位置参数
$#: 命令行参数个数
$*: 所有的参数,被当作一个字符串
$@: 所有的参数,每个参数都是一个独立的字符串
$!: 运行于后台的最后一个作业的PID
$_: 上一条命令的最后一个参数的值
$?:上一条命令状态返回值
$$: 脚本自身的PID
 
操作字符串:
${variable}: 变量引用
 
${varible:-default}:如果variable没有声明或者为空,则返回default字串,否则返回variable自身的值
${varible:+default}:如果variable没有声明或者为空,则返回空字串,否则返回default
${varible:=default}:如果variable没有声明或者为空,则返回default字串,并且将default赋值给variable,否则返回variable自身值
${varible:?default}:如果variable没有声明或者为空,则以default为错误信息返回,否则返回variable自身的值
 
${#variable}: 返回变量中字符串的长度
 
子串削除:
 
${varilable#*pattern}: 查找variable中自左而右第一次被pattern匹配到的串,将此串及向左的所有内容都删除
${varilable##*pattern}: 查找variable中自左而右最后一次被pattern匹配到的串,将此串及向左的所有内容都删除
 
${varilable%pattern*}: 查找variable中自右而左第一次被pattern匹配到的串,将此串及向右的所有内容都删除
${varilable%%pattern*}: 查找variable中自右而左最后一次被pattern匹配到的串,将此串及向右的所有内容都删除
 
取子串:
${variable:pos}: 偏移pos个字符,取余下的子串
name=jerry, ${name:2}结果为rry
                        ${variable:pos:num}: 偏移pos个字符,取num个字符长度的子串
name='hello world', ${name:2:5}结果为“llo w”
                                也可以从结尾部分开始截取:  ${name: -5}结果为world,${name: -5:2}结果为wo. (注意-5前面必须有一个空格)
                        
子串替换
${variable/Pattern/Replacement}:以Pattern为模块匹配variable中的字串,将第一次匹配到的内容替换为Replacement
${variable//Pattern/Replacement}:以Pattern为模块匹配variable中的字串,将匹配到的内容全部替换为Replacement
                      
                        ${var/#Pattern/Replacement}

        如果变量var前缀匹配Pattern, 那么就使用Replacement来替换匹配到Pattern的字符串.

            ${var/%Pattern/Replacement}

        如果变量var后缀匹配Pattern, 那么就使用Replacement来替换匹配到Pattern的字符串.

                          必须匹配字符串的开头或结尾, 否则是不会产生替换结果的.
 
声明变量:
declare
-i: 整型
-a: 数组
                        -A:关联数组
-x: 环境变量
 
-r: 只读变量,相当于readonly
-f: 声明函数
 

23 bash编程:数组初步

bash编程:数组初步
数组:数据结构,
数据序列:连续的多个数据,可以使用索引获取相关
 
元素
 
声明数组:declare -a arrayName
 
初始化或赋值:各元素间使用空白字符分隔
第一种:arrayName=('a' 'b' 'c')
第二种:arrayName=([index]='a' [index]='b')
第三种:arrayName[0]='a'; arrayName [1]='b'
 
获取数组中有效元素的个数:
 
${#arrayName[@]}, ${#arrayName[*]}
获取某一元素中字符串的长度:
 
${#arryName[*]} 数组元素数量
${#arryName[@]}数组元素数量
${!arryName[*]} 索引
 
bash伪随机数生成器:$RANDOM

 

24 bash知识点:while循环和until循环

bash知识点:while循环和until循环
 
for varName in 列表; do
    循环体
done
 
条件测试:
执行命令: 命令成功,条件测试成功;否则为失败;
根据$?, 状态返回值; 
 
表达式:
[ expression ]
[[ expression ]]
test expression
 
 
while 条件测试; do
循环体
done 
 
while循环:条件测试成功,则循环;失败,则退出;
 
 
如何退出?
必须有时刻:条件测试不成功
?: 条件控制变量
 
练习:求100以内所有正整数的和;
 
declare -i sum=0
declare -i i=1
 
while [ $i -le 100 ]; do
let sum+=$i
let i++
done
 
echo $sum
 
 
练习:求100以内所有偶数之和
 
declare -i evenSum=0
declare -i i=1
 
while [ $i -le 100 ]; do
if [ $[$i%2] -eq 0 ]; then
let evenSum+=$i
fi
let i++
done
 
echo $evenSum
 
 
 
 
 
declare -i evenSum=0
declare -i i=2
 
while [ $i -le 100 ]; do
let evenSum+=$i
let i+=2
done
 
echo $evenSum
 
如何让while循环退出:在循环体中改变测试条件中用于控制循环次数的变量的值;
 
 
练习:通过键盘提示用户输入字符,将用户输入的小写字母转换为大写,转换一次之后,再次提醒,再输再转换;但输入quit表示退出;
 
#!/bin/bash
 
read -p "Enter a word: " word
 
while [[ "$word" != "quit" ]]; do
echo $word | tr 'a-z' 'A-Z'
read -p "Enter a word again: " word
done
 
 
练习:显示如下菜单给用户
cpu) print cpu information;
mem) print memory information;
disk) print disk infomation;
quit) quit
Enter your option:
 
根据用户的选择输出相应信息;
每次执行后,不退出,而由用户再次指定新的选项;
 
#!/bin/bash
#
cat << EOF
cpu) print cpu information;
mem) print memory information;
disk) print disk infomation;
quit) quit
EOF
 
read -p "Enter your option: " option
option=`echo $option | tr 'A-Z' 'a-z'`
 
while [[ "$option" != "quit" ]]; do
if [[ "$option" == "cpu" ]]; then
cat /proc/cpuinfo
elif [[ "$option" == "mem" ]]; then
free -m
elif [[ "$option" == "disk" ]]; then
df -h
else 
echo "Wrong option..."
fi
 
read -p "Enter your option again: " option
option=`echo $option | tr 'A-Z' 'a-z'`
done
 
回顾:raid
md: Multi Disks
dm: Device Mapper
 
硬件:
BIOS
软件:
磁盘或RAID管理工具
 
提升性能、可用性(容错能力)
容错能力:raid1, raid4, raid5, raid6, raid10
提升写性能:raid0, raid4, raid5, raid6, raid10
 
mdadm
-A
-C
-a
-l
-x
-n
-c
-F
 
-S
-D
 
bash循环:while
 
while 条件; do
循环体
done
 
循环体中:不断地修改控制循环次数的变量,以使得其在某一时刻导致测试条件不能满足从而退出循环;
 
 
 
练习:提示用户输入一个用户名,如果存在:显示用户UID和SHELL信息;否则,则显示无此用户;
  显示完成之后,提示用户再次输入;如果是quit则退出;
#!/bin/bash
#
 
read -p "Enter a user name: " userName
 
while [[ "$userName" != "quit" ]]; do
        if [ -z "$userName" ]; then
                echo "User name null." 
        elif id $userName &> /dev/null; then
                grep "^$userName\>" /etc/passwd | cut -d: -f3,7
        else
                echo "No such user."
        fi
        read -p "Enter a user name again(quit to exit): " userName
done
 
 
 
 
        if [ -z "$userName" ]; then
                echo "User name null."
        else 
         if id $userName &> /dev/null; then
                grep "^$userName\>" /etc/passwd | cut -d: -f3,7
         else
                echo "No such user."
         fi
        fi
        read -p "Enter a user name again(quit to exit): " userName
 
练习:提示用户输入一个用户名,判断用户是否登录了当前系统; 
如果没有登录,则停止5秒钟之后,再次判断;直到用户登录系统,显示“用户来了”,而后退出;
 
#!/bin/bash
#
read -p "Enter a user name: " userName
 
while ! id $userName &> /dev/null; do
    read -p "Enter a user name again: " userName
done
 
who | grep "^$userName" &> /dev/null
retVal=$?
 
while [ $retVal -ne 0 ]; do
        sleep 5
        who | grep "^$userName" &> /dev/null
        retVal=$?
done
 
echo "$userName is on."
 
 
 
#!/bin/bash
#
read -p "Enter a user name: " userName
 
while ! id $userName &> /dev/null; do
    read -p "Enter a user name again: " userName
done
 
while ! who | grep "^$userName" &> /dev/null; do
        echo "$userName is not here."
        sleep 5
done
 
echo "$userName is on."
 
 
 
 
 
 
#!/bin/bash
#
read -p "Enter a user name: " userName
 
until [ -n "$userName" ] && id $userName &> /dev/null; do
    read -p "Enter a user name again: " userName
done
 
until who | grep "^$userName" &> /dev/null; do
        echo "$userName is not here."
        sleep 5
done
 
echo "$userName is on."
 
bash编程之until循环:
until 测试条件; do
循环体
done
 
条件不满足,则循环;否则,退出;
 
练习:用until循环,求100以内所有正整数之和;
#!/bin/bash
declare -i sum=0
declare -i i=1
 
until [ $i -gt 100 ]; do
let sum+=$i
let i++
done
 
echo $sum
 
 
 
 
bash编程之组合测试条件深入探讨:
 
逻辑与:多个条件同时满足
[ CONDITION1 ]  &&  [ CONDITION2 ] 
[ CONDITION1 -a CONDITION2 ] 
[[ CONDITION1 && CONDITION2 ]] 
 
注意:前两个使用单或双中括号都可,但,&&不允许用于单中括号中,所以第三种只能用于双中括号中;
 
逻辑或:多个条件中有一个满足即为真;
[ CONDITION1 ]  ||  [ CONDITION2 ] 
[ CONDITION1 -o CONDITION2 ] 
[[ CONDITION1 || CONDITION2 ]] 
 
注意:||不允许用于单中括号中;
 
 
德 摩根 定律
 
  !(条件1 或 条件2) = !条件1 并且 !条件2
  !(条件1 并且 条件2) = !条件1 或 !条件2
 
 
 
 
使用while循环一次读取文件的一行,直到文件尾部:
while read line; do
循环体
done < /path/to/somefile
 
练习:取出当前系统上,默认shell为bash的用户
#!/bin/bash
#
while read line; do
[[ `echo $line | cut -d: -f7` == "/bin/bash" ]] && echo $line | cut -d: -f1
done < /etc/passwd
 
 
练习:显示所有其ID号为偶数的用户;
#!/bin/bash
#
while read line; do
        userID=`echo $line | cut -d: -f3`
        if [ $[$userID%2] -eq 0 ]; then
                echo -n "$userID: "
                echo $line | cut -d: -f1
        fi
done < /etc/passwd
 
 
 
练习:显示/etc/rc.d/rc.sysinit文件中,其总字符个数大于30的行;
#!/bin/bash
#
while read line; do
charCounts=`echo $line | wc -c`
if [ $charCounts -gt 30 ]; then
echo -n "$charCounts: "
echo $line
fi
done < /etc/rc.d/rc.sysinit
 
 
练习:显示所有其UID和GID均为偶数的用户;
#!/bin/bash
#
while read line; do
        userID=`echo $line | cut -d: -f3`
        groupID=`echo $line | cut -d: -f4`
        if [ $[$userID%2] -eq 0 ] && [ $[$groupID%2] -eq 0 ]; then
                echo -n "$userID, $groupID: "
                echo $line | cut -d: -f1
        fi
done < /etc/passwd
 
练习:显示/etc/rc.d/rc.sysinit文件中,其总字符个数大于30且非以“#”开头的行;
 
#!/bin/bash
#
while read line; do
charCounts=`echo $line | wc -c`
if [ $charCounts -gt 30 ] && [[ "$line" =~ ^[^#] ]] ; then
echo -n "$charCounts: "
echo $line
fi
done < /etc/rc.d/rc.sysinit
 
 
 
 
练习:写一个脚本,完成如下任务
1、提示用户输入一个磁盘设备文件路径;
如果用户给定的路径文件不存在或不是一个块设备文件,则提示用户重新输入,直到输入正确为止,或者输入quit以9为退出码结束脚本;
2、提示用户“下面的操作会清空磁盘中的数据,并提问是否继续”
如果用户给出字符y或单词yes,则继续,否则,则提供以8为退出码结束脚本;
3、将用户指定的磁盘上的分区清空,而后创建两个主分,大小分别为100M和512M;
4、格式化此两个分区;
5、将第一个分区挂载至/mnt/boot目录;第二个分区挂载至/mnt/sysroot目录;
 
 
 
 
bash编程之循环控制:
for varName in LIST; do
循环体
done
 
while CONDITION; do
循环体
done
 
until CONDITION; do
循环体
done
 
循环控制:
continue: 提前结束本次循环而开始评估下一
 
轮;
break [n]: 跳出当前循环
 
练习:求100以内所有偶数之和;
 
declare -i evenSum=0
declare -i i=1
 
while [ $i -le 100 ]; do
if [ [$i%2] -eq 1 ]; then
let i++
continue
fi
let evenSum+=$i
let i++
done
 
 
练习:提示用户输入用户名,显示用户的ID号;直到用户输入
 
quit退出;
#!/bin/bash
#
if [ $UID -ne 0 ]; then
echo "`basename $0` must be running as root"
exit 1
fi
 
while true; do
read -p "Enter a user name: " userName
if [ "$userName" == 'quit' ]; then
break
fi
 
id -u $userName
done
 
 
 
 
#!/bin/bash
#
while true; do
        read -p "Enter a user name: " userName
        if [ "$userName" == 'quit' ]; then
                break
        fi
 
        if ! id $userName &> /dev/null; then
                echo "$userName not exist."
                continue
        fi
 
        id -u $userName
done
 
练习:写一个脚本,
1、提示用户输入一个磁盘设备的设备文件,如果设备文
 
件不存在,就提示用户重新输入,直到用户输入正确为止;
2、用户可以输入quit退出;
 
#!/bin/bash
#
while true; do
read -p "Enter a block device file: " diskFile
if [ "$diskFile" == 'quit' ]; then
exit 7
fi
 
if [ -b "$diskFile" ]; then
break
else
echo "Wrong device file..."
fi
done
 
练习:扩展前一题
当用户给出正确的块设备后:
1、显示用户输入块设备,并提示用户,后续的操作会损
 
坏设备上的所有文件,让用户选择是否继续
2、如果用户输入y,则继续后面的操作;
3、如果用户输入n,则显示用户选择了中止,并退出脚
 
本;
4、输入任何其它字符,则让用户重新选择;
 
练习:扩展上一题
1、如果用户选择了y, 则抹除指定块设备上的所有分区
 
 
#!/bin/bash
#
while true; do
        read -p "Enter a block device file: " diskFile
        if [ "$diskFile" == 'quit' ]; then
                exit 7
        fi
 
        if [ -b "$diskFile" ]; then
                break
        else
                echo "Wrong device file..."
        fi
done
 
echo "Device is: $diskFile."
 
while true; do
        read -p "Y or y for continue, N or n for quiting: 
 
" option
        option=`echo $option | tr 'A-Z' 'a-z'`
        if [ "$option" == 'n' ]; then
                exit 8
        fi
 
        if [ "$option" == 'y' ]; then
                break
        else
                echo "Wrong input..."
        fi
done
 
dd if=/dev/zero of=$diskFile bs=512 count=1
 
 
练习:写一个脚本
1、提示用户输入一个目录路径;
2、显示目录下至少包含一个大写字母的文件名;
 
#!/bin/bash
#
while true; do
        read -p "Enter a directory: " dirName
        [ "$dirName" == 'quit' ] && exit 3
        [ -d "$dirName" ] && break || echo "Wrong 
 
directory..."
done
 
 
for fileName in $dirName/*; do
        if [[ "$fileName" =~ .*[[:upper:]]{1,}.* ]]; then
                echo "$fileName"
        fi
done
 
 
 
练习:写一个脚本
前提:配置好yum源
1、如果本机没有一个可用的yum源,则提示用户,并退
 
出脚本(4);如果此脚本非以root用户执行,则显示仅有root才
 
有权限安装程序包,而后退出(3);
2、提示用户输入一个程序包名称,而后使用yum自动安
 
装之;尽可能不输出yum命令执行中的信息;
如果安装成功,则绿色显示,否则,红色显示
 
失败;
3、如果用户输入的程序包不存在,则显示错误后让用户
 
继续输入;
4、如果用户输入quit,则正常退出(0);
5、正常退出前,显示本地共安装的程序包的个数;

 

 25 shell 中数学计算总结

1、错误方法举例 
a) 
var=1+1 
echo $var 
输出的结果是1+1,悲剧,呵呵 

b) 
var=1 
var=$var+1 
echo $var 
输出结果是1+1,依然悲剧,呵呵 

2、正确方法 
1)使用let 
var=1 
let "var+=1" 
echo $var 
输出结果为2,这次没有悲剧 
注意: 
a)经我测试let几乎支持所有的运算符,在网上看到一篇文章说“let不支持++、--和逗号、(、)”,但经我测试自加、自减、以及括号的优先级都得到了很好的支持 
b)方幂运算应使用“**” 
c)参数在表达式中直接访问,不必加$ 
d)一般情况下算数表达式可以不加双引号,但是若表达式中有bash中的关键字则需加上 
e)let后的表达式只能进行整数运算 

2)使用(()) 
var=1 
((var+=1)) 
echo $var 
输出结果为2 
注意: 
(())的使用方法与let完全相同 

3)使用$[] 
var=1 
var=$[$var+1] 
echo $var 
输出结果位2 
注意: 
a)$[]将中括号内的表达式作为数学运算先计算结果再输出 
b)对$[]中的变量进行访问时前面需要加$ 
c)$[]支持的运算符与let相同,但也只支持整数运算 

4)使用expr 
var=1 
var=`expr $var + 1` 
echo $var 
输出结果为2 
注意: 
a)expr后的表达式个符号间需用空格隔开 
b)expr支持的操作符有: |、&、<、<=、=、!=、>=、>、+、-、*、/、% 
c)expr支持的操作符中所在使用时需用\进行转义的有:|、&、<、<=、>=、>、* 
e)expr同样只支持整数运算 

5)使用bc(可以进行浮点数计算) 
var=1 
var=`echo "$var+1"|bc` 
echo $var 
输出结果为2 
介绍: 
bc是linux下的一个简单计算器,支持浮点数计算,在命令行下输入bc即进入计算器程序,而我们想在程序中直接进行浮点数计算时,利用一个简单的管道即可解决问题。 
注意: 
1)经我测试bc支持除位操作运算符之外的所有运算符。 
2)bc中要使用scale进行精度设置 
3)浮点数计算实例 
var=3.14 
var=`echo "scale=2;$var*3"|bc` 
echo $var 
输出结果为9.42 

6)使用awk(可已进行浮点数计算) 
var=1 
var=`echo "$var 1"|awk '{printf("%g",$1*$2)}'` 
echo $var 
输出结果为2 
介绍: 
awk是一种文本处理工具,同时也是一种程序设计语言,作为一种程序设计语言,awk支持多种运算,而我们可以利用awk来进行浮点数计算,和上面bc一样,通过一个简单的管道,我们便可在程序中直接调用awk进行浮点数计算。 
注意: 
1)awk支持除微操作运算符之外的所有运算符 
2)awk内置有log、sqr、cos、sin等等函数 
3)浮点数计算实例 
var=3.14 
var=`echo "$var 2"|awk '{printf("%g",sin($1/$2))}'` 
echo $var 
输出结果为1 
3、总结 
终于把所有能搜集到的资料看完,并最后总结出一套自己的东西了,以后再遇到类似问题就有的看了,哈哈~ 

 26 

推荐阅读