分类目录归档:Shell编程

条件判断与流程控制

一、流程控制语句
1、条件判断式
1)按照文件类型进行判断
According to the file type

两种判断格式

[root@localhost ~]# test -e /root/install.log
[root@localhost ~]# [ -e /root/install.log ]

简单的判断式

[root@localhost ~]# [ -d /root ] && echo "yest" || echo "no"
#第一个判断命令如果正确执行,则打印"yes",否则打印"no"

2)按照文件权限进行判断
According to the file permissions for judgment

[root@localhost ~]# [ -w student.txt] && echo "yes" || echo "no"
#判断文件是拥有写权限的

3)两个文件之间进行比较
Comparison between the two files

[root@localhost ~]# ln /root/student.txt /tmp/stu.txt
#创建硬链接
[root@localhost ~]# [ /root/student.txt -ef /tmp/stu.txt] && echo "yes" || echo "no"
#判断两个文件是否为同一个文件

4)两个整数之间的比较
The comparison between two integer

[root@localhost ~]# [ 23 -ge 22 ] && echo "yes" || echo "no"
#判断23是否大于等于22

[root@localhost ~]# [ 23 -le 22 ] && echo "yes" || echo "no"
#判断23是否小于等于22

5)字符串的判断
A string of judgment

[root@localhost ~]# name=fengj
@给name变量赋值
[root@localhost ~]# [ -z "$name" ] && echo "yes" || echo "no"
#判断name变量是否为空

[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
#给变量aa和变量bb赋值
[root@localhost ~]# [ "$aa" == "bb" ] && echo "yes" || echo "no"
#判断两个变量的值是否相等

6)多重条件判断
Multiple conditions determine

[root@localhost ~]# aa=11
[root@localhost ~]# [ -n "$aa" -a "$aa" -gt 23 ] && echo "yes" || echo "no"
#判断变量aa是否有值,同时判断变量aa的是否大于23
#因为变量aa的值不大于23,所以虽然第一个判断值为真,返回的结果也是假

2、单分支if语句
单分支if条件语句

if [ 条件判断式 ];then
   程序
fi
#或者
if [ 条件判断式 ]
   then
   程序
fi

单分支条件语句需要注意几个点
#if语句使用fi结尾,和一般语言使用大括号结尾不同
#[ 条件判断式 ]就是使用test命令判断,所以中括号和条件判断式之间必须有空格
#then后面跟符合条件之后执行的程序,可以放在[]之后,用”;”分割。也可以换行写入,就不需要”;”了

例子1:判断登陆的用户是否为root

#!/bin/bash
test=$(env | grep "USER" | cut -d "=" -f 2)
if [ "$test" == root]
   then
   echo "Current user is root."
fi

例子2:判断分区使用率

#!/bin/bash
#统计根分区使用率

#把根分区使用率作为变量值赋予变量rate
rate=$(df -h | grep "/dev/sda3" | awk '{print $5}' | cut -d "%" -f 1)

if [ $rate -ge 80 ]
then
    echo "Warning! /dev/sda3 is full!!"
fi

3、双分支if语句
双分支if条件语句

if [ 条件判断式 ]
then
    条件成立时,执行的程序
else
    条件不成立时,执行的另一个程序
fi

例子1:判断输入的是否是一个目录

#!/bin/bash
#判断输入的文件是否是一个目录
read -t 30 -p "Please input a directory: " dir

if [ -d $dir ]
then
    echo "yes"
else
    echo "no"
fi

例子2:判断apache是否启动

#!/bin/bash
#截取httpd进程,并把结果赋予变量test
test=$(ps aux | grep httpd | grep -v grep)
if [ -n "$test" ]
#如果test的值不为空,则执行then中命令
then
    echo "$(date) httpd is ok!" >> /tmp/autostart-acc.log
else
    /etc/rc.d/init.d/httpd start &> /dev/null
    echo "$(date) restart httpd !!" >> /tmp/autostart-err.log
fi

4、多分支if语句
多分支if条件语句

if [ 条件判断式1 ]
   then
       当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
   then
       当条件判断式2成立时,执行程序2
...省略更多条件
else
       当所有条件都不成立时,最后执行此程序
fi

例子

#!/bin/bash
#字符界面加减乘除计算器

read -t 30 -p "Please input num1: " num1
read -t 30 -p "Please input num2: " num2
#通过read命令接收要计算的数值,并赋予变量num1和num2
read -t 30 -p "Please input a operator: " ope

if [ -n "$num1" -a -n "$num2" -a -n "$ope" ]
#第一层判断,用来判断num1,num2和ope中都有值
then
       test1=$(echo $num1 | sed 's/[0-9]//g')
       test2=$(echo $num2 | sed 's/[0-9]//g')
       #定义变量test1和test2的值为$(命令)的结果
       #后续命令作用是,把变量test1的值替换为空。如果能替换为空,证明num1的值为数字
       #如果不能替换为空,证明num1的值为非数字。我们使用这种方法判断变量num1的值为数字
       #用同样的方法测试test2变量

       if [ -z "$test1" -a -z "$test2" ]
          #第二层判断,用来判断num1和num2为数值
          #如果变量test1和test2的值为空,则证明num1和num2是数字
          then
          #如果test1和test2是数字,则执行以下命令
          if [ "$ope" == '+' }
             #第三层判断用来确认运算符
             #测试变量$ope中是什么运算符
             then
                sum=$(( $num1 + $num2))
                #如果是加号则执行加法运算
          elif [ "$ope" == '-' ]
             then
                 sum=$(($num1 - $num2))
                 #如果是减号,则执行减法运算
          elif [ "$ope" == '*' ]
             then
                 sum=$(( $num1 * $num2))
                 #如果是乘号,则执行乘法运算
          elif [ "$ope" == '/' ]
             then
                 sum=$(( $num1 / $num2))
                 #如果除号,则执行除法运算
          elif [ "$ope" == '%' ]
             then
                 sum=$(( $num1 % $num2))
                 #如果是取模,则执行取模运算
          else
             echo "Please enter a valid symbol"
             #如果运算符不匹配,提示输入有效的符号
             exit 10
             #并退出程序,返回错误代码10
          fi
       elif
           #如果test1和test2不为空,说明num1和num2不是数字
           echo "Please enter a valid value"
           #则提示输入有效的数值
           exit 11
           #并退出程序,返回错误代码11
       fi
elif
    echo "qing shuru neirong"
    exit 12
fi

echo " $num1 $ope $num2 : $num"
#输出数值运算的结果

例子:从1加到100

#!/bin/bash
#从1加到100

s=0
for(( i=1;i<=100;i=i+1 ))
  do
    s=$(( $s+$i))
  done
echo "The sum of 1+2+...+100 is: $s"

例子:批量添加指定数量的用户

#!/bin/bash
#批量添加指定数量的用户

read -p "Please input user name: " -t 30 name
read -p "Please input the number of users: " -t 30 num
read -p "Please input the password of users: " -t 30 pass
if [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass"]
then
   y=$(echo $num | sed 's/[0-9]//g')
   if [ -z "$y" ]
   then
     for(( i=1;i<=$num;i=i+1 )) do /usr/sbin/useradd $name$i &>/dev/null
         echo $pass | /usr/bin/passwd --stdin $name$i &>/dev/null
       done
   fi
fi

5、case语句
多分支case条件语句
#case语句和if..elif..else语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系。

case $变量名 in
    "值1")
      如果变量的值等于值1,则执行程序1
      ;;
    "值2")
      如果变量的值等于值2,则执行程序2
      ;;
    ...省略其他分支
    *)
      如果变量的值都不是以上的值,则执行此程序
      ;;
esac

6、for循环
语法一:

for 变量 in 值1 值2 值3 ...
  do
    程序
  done

例子:批量解压脚本

#!/bin/bash
#批量解压缩脚本

cd /root/test
ls *.tar.gz > /tmp/ls.log
for i in $(cat ls.log)
   do
     tar -zxf $i &>/dev/null
   done
rm -rf /tmp/ls.log

语法二

for (( 初始值;循环控制条件;变量变化 ))
   do
     程序
   done

7、while循环和until循环
1)while循环
while循环是不定循环,也称作条件循环。只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才停止。这就和for的固定循环不太一样了。

while [ 条件判断式 ]
   do
      程序
   done

2)until循环
# until循环,和while循环相反,until循环时只要条件判断式不成立则进行循环,并执行循环程序。一旦循环条件成立,则终止循环。

until [ 条件判断式 ]
  do 
    程序
  done

Shell正则表达式

一、正则表达式
1、正则表达式是什么
#正则表达式是用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。

2、正则表达式与通配符
#正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配。grep、awk、sed等命令可以支持正则表达式。
#通配符用来匹配符合条件的文件名,通配符是完全匹配。ls、find、cp这些命令不支持正则表达式,所以只能使用shell自己的通配符来进行匹配了

通配符
— * 匹配任意内容
— ? 匹配任意一个内容
— [] 匹配中括号中的一个字符

3、基础正则表达式
Based on regular expressions

1)”.”匹配除了换行符任意一个字符

"s..d"
#"s..d"会匹配在s和d这两个字母之间一定有两个字符的单词
"s.*d"
#匹配s和d字母之间有任意字符
".*"
#匹配所有内容

2)”^”匹配行首,”$”匹配行尾

"^M"
#匹配以大写“M”开头的行
"n$"
#匹配以小写"n"结尾的行
"^$"
#会匹配空白行

3)”[]”匹配中括号中指定的任意一个字符,只匹配一个字符

"s[ao]id"
#匹配s和i字母中,要不是a、要不是o
"[0-9]
#匹配任意一个数字
"^[a-z]"
#匹配用小写字母开头的行

4)”[^]”匹配除中括号的字符以外的任意一个字符

"^[^a-z]"
#匹配不用小写字母开头的行
"^[^a-aA-Z]"
#匹配不用字母开头的行

5)”\”转义符

"\.$"
#匹配使用"."结尾的行

6)”\{n\}”表示其前面的字符恰好出现n次

"a\{3\}"
#匹配a字母连接出现三次的字符串
"[0-9]\{3\}"
#匹配包含连续的三个数字的字符串

7)”\{n,\}表示其前面的字符出现不小于n次

"^[0-9]\{3,\}[a-z]
#匹配最少用连续三个数字开头的行

8)”\{n,m\}”匹配其前面的字符至少出现n次,最多出现m次

"sa\{1,3\}i"
#匹配在字母s和字母i之间有最少一个a,最多三个a

4、例子

[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}
#匹配日期格式YYYY-MM-DD

[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}
#匹配IP地址

二、字符截取命令
1、cut字段提取命令
[root@localhost ~]# cut [选项] 文件名
选项:
— -f 列号:提取第几列
— -d 分隔符:按照指定分隔符分割列

cut命令的局限
— df -h | cut -d ” ” -f 1,3

2、printf命令
printf ‘输出类型输出格式’ 输出内容

输出类型:
— %ns:输出字符串。n是数字指代输出几个字符
— %ni:输出整数。n是数字指代输出几个数字
— %m.nf:输出浮点数。m和n是数字,指代输出的整数位数和小数位数如%8.2f代表共输出8位数,其中2位是小数,6位是整数。

输出格式:
— \a:输出警告声音
— \b:输出退格键,也就是Backspace键
— \f:清除屏幕
— \n:换行
— \r:回车,也就是Enter键
— \t:水平输出退格键,也就是Tab键
— \v:垂直输出退格键,也就是Tab键

例:

[root@localhost ~]# printf %s 1 2 3 4 5 6
[root@localhost ~]# printf %s %s %s 1 2 3 4 5 6
[root@localhost ~]# printf '%s %s %s' 1 2 3 4 5 6 
[root@localhost ~]# printf '%s %s %s\n' 1 2 3 4 5 6 

[root@localhost ~]# printf '%s' $(cat student.txt)
#不调整输出格式

[root@localhost ~]# printf '%s\t%s\t%s\t%s\n $(cat student.txt)
#调整格式输出

在awk命令的输出中支持print和printf命令
— print:print会在每个输出之后自动加入一个换行符(Linux默认没有print命令)
— printf:printf是标准格式输出命令,并不会自动加入换行符,如果需要换行,需要手工加入换行符

3、awk命令
# awk ‘条件1{动作1} 条件2{动作2}…’ 文件名

条件(Pattern)
— 一般使用关系表达式作为条件
— x>10判断变量 x是否大于10
— x>=10大于等于
— x<=10小于等于
动作(Action)
— 格式化输出
— 流程控制语句

例:

[root@localhost ~]# vim student.txt
student.txt content
ID      Name    gender  Mark
1       furong  F       85
2       fengj   F       60
3       cang    F       70
[root@localhost ~]# awk '{printf $2 "\t" $4 "\n"}' student.txt
[root@localhost ~]# df -h | awk '{print $1 "\t" $3}'

BEGIN
[root@localhost ~]# awk ‘BEGIN{printf “This is a transcript \n”} {printf $2 “\t” $4 “\n”}’ student.txt

END
[root@localhost ~]# awk ‘END{printf “The End\n”} {printf $2 “\t” $4 “\n”}’ student.txt

FS内置变量
[root@localhost ~]# cat /etc/passwd | grep “/bin/bash” | awk ‘BEGIN{FS=”:”}{printf $1 “\t” $3 “\n”}’

关系运算符
[root@localhost ~]# cat student.txt | grep -v Name | awk ‘$4>=70{printf $2 “\n”}’

4、sed命令
#sed 是一种几乎包括在所有UNIX平台(包括Linux)的轻量级流编辑器。sed主要是用来将数据进行选取、替换、删除、新增的命令。

sed [选项] '[动作]' 文件名
选项:
-- -n:一般sed命令会把所有数据都输出到屏幕,如果加入此选择则只会把经过sed命令处理的行输出到屏幕。
-- -e:允许对输入数据应用多条sed命令编辑
-- -i:用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出。

动作:
— a:追加,在当前行后添加一行或多行
— c:行替换,用c后面的字符串替换原数据行
— i:插入,在当前行行前插入一行或多行。
— d:删除,删除指定的行
— p:打印,输出指定的行。
— s:字串替换,用一个字符串替换另外一个字符串。格式为“行范围s/旧字串/新字串/g”(和vim中的替换格式类似)。

行数据操作

[root@localhost ~]# sed '2p' student.txt
#查看文件的第二行
[root@localhost ~]# sed -n '2p' student.txt
#查看文件的第二行,且只显示第二行
[root@localhost ~]# sed '2,4d' student.txt
#删除第二行到第四行的数据,但不修改文件本身
[root@localhost ~]# sed '2a piaoliang jiushi renxing' student.txt
#在第二行后追加
[root@localhost ~]# sed '2i meinv' student.txt
#在第二行前插入两行数据
[root@localhost ~]# sed '2c furong bu ji ge' student.txt
#数据替换

字符串替换
sed ‘s/旧字串/新字串/g’ 文件名

[root@localhost ~]# sed '3s/60/99/g' student.txt
#在第三行中,把60换成99

[root@localhost ~]# sed -i '3s/60/99/g' student.txt
#sed操作的数据直接写入文件

[root@localhost ~]# sed -e 's/fengj//g;s/cang//g' student.txt
#同时把"fengj"和"cang"替换为空

三、字符处理
1、排序命令sort
[root@localhost ~]# sort [选项] 文件名
选项:
— -f:忽略大小写
— -n:以数值型进行排序,默认使用字符串型排序
— -r:反向排序
— -t:指定分隔符,默认是分隔符是制表符
— -k n[,m]:按照指定的字段范围排序。从第n字段开始,m字段结束(默认到行尾)

[root@localhost ~]# sort /etc/passwd
#排序用户信息文件

[root@localhost ~]# sort -r /etc/passwd
#反向排序

[root@localhost ~]# sort -t ":" -k 3,3 /etc/passwd
#指定分隔符是":",用第三字段开头,第三字段结尾排序,就是只用第三字段排序

[root@localhost ~]# sort -n -t ":" -k 3,3 /etc/passwd

2、统计命令wc
[root@localhost ~]# wc [选项] 文件名
选项:
— -l:只统计行数
— -w:只统计单词数
— -m:只统计字符数

Shell环境变量配置文件

一、环境变量配置文件简介
1、source命令

[root@localhost ~]# source 配置文件
或
[root@localhost ~]# .配置文件

注:修改配置文件后,必须注销重新登录才能生效,使用source命令可以不用重新登录
例:

[root@localhost ~]# . .bashrc
或
[root@localhost ~]# source .bashrc

2、环境变量配置文件简介
PATH、HISTSIZE、PS1、HOSTNAME等环境变量写入对应的环境变量配置文件
环境变量配置文件中主要是定义对系统操作环境生效的系统默认环境变量,如PATH等

— /etc/profile
— /etc/profile.d/*.sh
— ~/.bash_profile
— ~/.bashrc
— /etc/bashrc

二、环境变量配置文件的功能
Environment variable configuration file

1、/etc/profile的作用
USER变量:
LOGNAME变量:
MAIL变量:
PATH变量:
HOSTNAME变量:
HISTSIZE变量
umask:
调用/etc/profile.d/*.sh文件

2、umask权限
#查看系统默认权限
注意:
1)文件最高权限为666
2)目录最高权限为777
3)权限不能使用数据进行换算,而必须使用字母
4)umask定义的权限,是系统默认权限中准备丢弃的权限

3、~/.bash_profile的作用
调用了~/.bashrc文件。
在PATH变量后面加入了”:$HOME/bin”这个目录

4、~/.bashrc的作用
定义默认别名
调用/etc/bashrc

5、/etc/bashrc的作用
PS1变量
umask
PATH变量
调用/etc/profile.d/*.sh文件

三、其他配置文件
1、注销时生效的环境变量配置文件
~/.bash_logout

2、命令历史记录文件
~/.bash_history

3、Shell登录信息
1)本地终端欢迎信息:/etc/issue
Shell login information

2)远程终端欢迎信息:/etc/issue.net
#转义符在/etc/issue.net文件中不能使用
#是否显示此欢迎信息,由ssh的配置文件/etc/ssh/sshd_config决定,加入”Banner /etc/issue.net”行才能显示(记得重启SSH服务)

3)登录后欢迎信息:/etc/motd
#不管是本地登录,还是远程登录,都可以显示此欢迎信息

Shell运算符

一、declare命令
1、declare声明变量类型
— [root@localhost ~]# declare [+/-][选项] 变量名
选项:
— -:给变量设定类型属性
— +:取消变量的类型属性
— -a:将变量声明为数组型
— -i:将变量声明为整数型(integer)
— -x:将变量声明为环境变量
— -r:将变量声明为只读变量
— -p:显示指定变量的被声明类型

2、变量声明为数值型

[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
#给变量aa和bb赋值
[root@localhost ~]# declare -i cc=$aa+$bb
#声明变量cc的类型是整数型,它的值是aa和bb的和

3、声明数组

#定义数组
[root@localhost ~]# movie[0]=zp
[root@localhost ~]# movie[1]=tp
[root@localhost ~]# declare -a movie[2]=live
#查看数组
[root@localhost ~]# echo ${movie}
[root@localhost ~]# echo ${movie[2]}
[root@localhost ~]# echo ${movie[*]}

4、声明环境变量
declare -x test =123
#和export作用相似,但其实是declare命令的作用

5、声明变量只读属性
[root@localhost ~]# declare -r test
#给test赋予只读属性,但是请注意只读属性会让变量不能修改不能删除,甚至不能取消只读属性

6、查询变量的属性
declare -p
#查询所有变量的属性

declare -p 变量名
#查询指定变量的属性

二、数值运算的方法
1、数值运算方法1

[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
#给变量aa和bb赋值
[root@localhost ~]# declare -i cc=$aa+$bb

2、方法2:expr或let数值运算工具

[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
#给变量aa和变量bb赋值
[root@localhost ~]# dd=$(expr $aa + $bb)
#dd的值是aa和bb的和。注意”+“号左右两侧必须有空格

3、方法3:”$((运算式))” 或 “$[运算式]”

[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
[root@localhost ~]# ff=$(($aa+$bb))
[root@localhost ~]# gg=$[$aa+$bb]

4、运算符
The operator

例:

[root@localhost ~]# aa=$(((11+3)*3/2))
#虽然乘和除的优先级高于加,但是通过小括号可以调整运算优先级

[root@localhost ~]# bb=$((14%3))
#14不能被3整除,余数是2

[root@localhost ~]# cc=$((1&&0))
#逻辑与运算只有想与的两边都是1,与的结果才是1,否则与的结果是0

三、变量测试
Variable test

Shell变量

一、什么是变量与变量分类
1、什么是变量
# 变量是计算机内存的单元,其中存放的值可以改变
# 变量让你能够把程序中准备使用的每一段数据都赋给一个简短、易于记忆的名字,因此它们十分有用。

2、变量命名规则
# 变量名必须以字母或下划线打头,名字中间只能由字母、数字和下划线组成。
# 变量名的长度不得超过255个字符。
# 变量名在有效的范围内必须是唯一的。
# 在Bash中,变量的默认类型都是字符串型

3、变量按照存储数据分类
# 字符串型
# 整型
# 浮点型
# 日期型

4、变量的分类
# 用户自定义变量。变量自定义的
# 环境变量:这种变量中主要保存的是和系统操作环境相关的数据。变量可以自定义,但是对系统生效的环境变量名和变量作用是固定的
# 位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的
# 预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的

二、用户自定义变量
1、定义变量
变量名=变量值(等号前后不能有空格)
例如:
— x=5
— name=”jie cao”

2、变量调用
echo $变量名
例如:
— echo $x
— echo $name

3、变量叠加
— x=123
— x=”$x”456
— x=${x}789

4、变量查看
set
选项
— u:如果设定此选项,调用未声明变量时会报错(默认无任何提示)

5、变量删除
unset 变量名

三、环境变量
1、环境变量与用户自定义变量的区别?
# 环境变量和用户自定义变量最主要的区别在于,环境变量是全局变量,而用户自定义变量是局部变量。用户自定义变量只在当前的Shell中生效,而环境变量会在当前Shell和这个Shell的所有子Shell当中生效
# 变量可以自定义,但是对系统生效的环境变量名和变量作用是固定的

— [root@localhost ~]# pstree
# 查看进程树

2、设置环境变量
export 变量名=变量值

变量名=变量值
export 变量名

3、查看环境变量
set
# 查看所有变量

env
# 查看环境变量

4、删除环境变量
unset 变量名

5、常用环境变量
— HOSTNAME:主机名
— SHELL:当前的shell
— TERM:终端环境
— HISTSIZE:历史命令条数
— SSH_CLIENT:当前操作环境是用ssh连接的,这里记录客户端ip
— SSH_TTY:ssh连接的终端时pts/1
— USER:当前登录的用户

6、PATH环境变量
PATH变量:系统查找命令的路径

— echo $PATH
# 查看PATH环境变量

— PATH=”$PATH”:/root/sh
#增加PATH变量的值

7、PS1环境变量
PS1变量:命令提示符设置
— \d:显示日期,格式为”星期 月 日“
— \H:显示完整的主机名。如默认主机名”localhost.localdomain”
— \t:显示24小时制时间,格式为”HH:MM:SS”
— \A:显示24小时制时间,格式为”HH:MM”
— \u:显示当前用户名
— \w:显示当前所在目录的完整名称
— \W:显示当前所在目录的最后一个目录
— \$:提示符。如果是root用户会显示提示符为”#”,如果是普通用户会显示提示符为”$”

例:
— [root@localhost ~]# PS1='[\u@\A \w]\$ ‘

8、当前语系查询
locale
# 查询当前系统语系
— LANG:定义系统主语系的变量
— LC_ALL:定义整体语系的变量

9、语系变量LANG
echo $LANG
# 查看系统当前语系
locale -a | more
# 查看Linux支持的所有语系

10、查询系统默认语系
cat /etc/sysconfig/i18n

11、Linux中文支持
前提条件,正确安装的中文字体和中文语系
# 如果有图形界面,可以正确支持中文显示
# 如果使用第三方远程工具,只要语系设定正确,可以支持中文显示
# 如果使用纯字符界面,必须使用第三方插件(如zhcon等)

四、位置参数变量
1、位置参数变量
Location parameter variables

例子1:

#!/bin/bash
num1=$1
num2=$2
sum=$(($num1+$num2))
#变量sum的和是num1加num2
echo $sum
#打印变量sum的值

例子2

#!/bin/bash
echo "A total of $# parameters"
#使用$#代表所有参数的个数
echo "The parameters is:$*"
#使用$*代表所有的参数
echo "The parameters is:$@"
#使用$@也代表所有参数

例子3:$*与$@的区别

#!/bin/bash
for i in "$*"
#$*中的所有参数看成是一个整体,所以这个for循环只会循环一次
  do
      echo "The parameters is $i"  
  done

for y in "$@"
#$@中的每个参数都看成是独立的,所以"$@"中有几个参数,就会循环几次
  do
     echo "Parameter:$y"
  done

五、预定义变量
1、预定义变量
The predefined variables

2、接收键盘输入
read [选项] [变量名]
选项:
— -p “提示信息”:在等待read输入时,输出提示信息
— -t 秒数:read命令会一直等待用户输入,使用此选项可以指定等待时间
— -n 字符数:read命令只接受指定的字符数,就会执行
— -s:隐藏输入的数据,适用于机密信息的输入