1. 逐行读取文件
注意:由于使用for来读入文件里的行时,会自动把空格和换行符作为一样分隔符,如果行里有空格的时候,输出的结果会很乱,所以只适用于行连续不能有空格或者换行符的文件
注意:由于使用while来读入文件里的行时,会整行读入,不会关注行的内容(空格..),所以比for读文件有更好的适用性,推荐使用while循环读取文件
2. bash shell 脚本中常用隐含变量
$0 |
当前执行的脚本或者命令名称 |
$1-$9 |
代表参数的位置. 举例 $1 代表第一个参数. |
$# |
脚本调用的参数的个数 |
$@ |
所有参数的内容 |
$* |
所有参数的内容 |
$$ |
当前运行脚本的进程号 |
$? |
命令执行后返回的状态 |
$! |
后台运行的最后一个进程号 |
注意: $? 用于检查上一个命令执行是否正确(在Linux中,命令退出状态为0表示该命令正确执行,任何非0值表示命令出错)
$$ 变量最常见的用途是用做暂存文件的名字以保证暂存文件不会重复。
$* 和 $@ 如果输出是一样的,但是在使用for循环,在使用 双引号("")引用时 "$*" 会输出成一个元素 而 "$@" 会按照每个参数是一个元素方式输出
请看测试例子
#cat test.sh
#!/bin/sh
echo '"$@" output.....'
for i in "$@"
do
echo $i
done
echo '"$*" output ....'
for i in "$*"
do
echo $i
done
输出结果
#sh test.sh a b c d
"$@" output.....
a
b
c
d
"$*" output ....
a b c d
从输出结果可以看出 "$*" 输出是一行 而 "$@" 输出则是四行
3. 变量内容的删除与替换
我们在一些情况下,需要对变量中的字符窜进行查找删除或者替换,就需要使用下表列出的方法
变量设定方式
说明
${变量#关键字} |
若变量内容从头开始的资料符合‘关键字’,则将符合的最短资料删除 |
${变量##关键字} |
若变量内容从头开始的资料符合‘关键字’,则将符合的最长资料删除 |
${变量%关键字} |
若变量内容从尾向前的资料符合‘关键字’,则将符合的最短资料删除 |
${变量%%关键字} |
若变量内容从尾向前的资料符合‘关键字’,则将符合的最长资料删除 |
${变量/旧字串/新字串} |
若变量内容符合‘旧字串’则‘第一个旧字串会被新字串取代 |
${变量//旧字串/新字串} |
若变量内容符合‘旧字串’则‘全部的旧字串会被新字串取代 |
举例如下(删除字符窜中的某个字符):
[root@linux ~]# export test_str="/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"
[root@linux ~]# echo ${test_str#/*kerberos/bin:}
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
4. 变量条件测试赋值
在某些时刻我们需要‘判断’某个变量是否存在,若变量存在则将此变量值赋值给新的变量,若变量不存在则将其他值赋值给新的变量.
变量设定方式
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} |
expr 输出至 stderr |
var= |
var=$str |
var=${str:?expr} |
expr 输出至 stderr |
expr 输出至 stderr |
var=$str |
var=${str=expr} |
var=expr |
var= |
var=$str |
var=${str:=expr} |
var=expr |
var=expr |
var=$str |
举例如下:
[root@linux ~]# test_name=""
[root@linux ~]# test_name=${test_name-root}
[root@linux ~]# echo $test_name
<== 因为 test_name 被设定为空字符窜!所以当然还是保留为空字符窜!
[root@linux ~]# test_name=${test_name:-root}
[root@linux ~]# echo $test_name
root <== 加上‘:’后若变量内容为空或者是未设定,都能够以后面的内容替换!
基本上这种变量的测试也能够透过 shell script 内的 if...then... 来处理,不过通过上述提及的简单的方法来测试变量,是程序看起来更精简一些!
5. shell 中分隔符 : 变量IFS 使用
shell脚本中,如果使用for循环一个字符窜的话,默认使用空格来分割字符窜.还有前面所提到的 使用for循环逐行读取文件内容时候,文件行中如果有空格的话输出的结果也会变乱.这个时候 使用 IFS 变量来设置特定的字符窜分割符来,达到输出正确的目的.默认情况下 IFS 是使用 <space><tab><newline>, 空格 \t \n 来作为默认的分割符的.
我们将前面使用for逐行读取文件的例子 改进下就可以输出正确了,请看下面
#!/bin/bash
IFS_old=$IFS #将原IFS值保存,以便用完后恢复
IFS=$’\n’ #更改IFS值为$’\n’
for line in `cat file.txt`
do
echo $line
done
file.txt 文件内容如下
[root@linux]$ cat file.txt
sdfsdfsdfsdf
ssssss ssssss ssssss sssss
sdfsdfsdfsdfsdf
执行测试程序 输出结果如下(正确输出)
[root@linux]$ sh test.sh
sdfsdfsdfsdf
ssssss ssssss ssssss sssss
sdfsdfsdfsdfsdf
如果未设置IFS变量,使用默认的IFS变量值 ,输出结果如下
[root@linux]$ sh test.sh
sdfsdfsdfsdf
ssssss
ssssss
ssssss
sssss
sdfsdfsdfsdfsdf
从以上测试程序输出结果,可以根据自己的需求来设定 IFS变量,在举一个例子如下:
while IFS=: read userName passWord userID groupID geCos homeDir userShell
do
echo "$userName -> $homeDir"
done < /etc/passwd
6. shell 数组的使用
数组赋值方式:
(1) array=(var1 var2 var3 ... varN)
(2) array=([0]=var1 [1]=var2 [2]=var3 ... [n]=varN)
(3) array[0]=var1
arrya[1]=var2
...
array[n]=varN
计算数组元素个数或者长度:
(1) ${#array[@]}
(2) ${#array[*]}
了解了数组基础语法,举例说明,请看:
#!/bin/bash
NAMESERVERS=("ns1.www.net." "ns2.www.net." "ns3.www.net.")
# 得到数组长度
tLen=${#NAMESERVERS[@]}
# 循环数组
for (( i=0; i<${tLen}; i++ ));
do
echo ${NAMESERVERS[$i]}
done
在看一个复杂一点的例子,将文件内容读取到数组中:
#!/bin/bash
# 设置IFS将分割符 设置为 换行符(\n)
OLDIFS=$IFS
IFS=$'\n'
# 读取文件内容到数组
fileArray=($(cat file.txt))
# restore it
IFS=$OLDIFS
tLen=${#fileArray[@]}
# 循环显示文件内容
for (( i=0; i<${tLen}; i++ ));
do
echo "${fileArray[$i]}"
done
7. 逻辑判断 条件测试
操作符
测试结果
-e filename |
文件存在返回1, 否则返回0 |
-r filename |
文件可读返回1,否则返回0 |
-w filename |
文件可写返回1,否则返回0 |
-x filename |
文件可执行返回1,否则返回0 |
-o filename |
文件属于用户本人返回1, 否则返回0 |
-z filename |
文件长度为0返回1, 否则返回0 |
-f filename |
文件为普通文件返回1, 否则返回0 |
-d filename |
文件为目录文件时返回1, 否则返回0 |
举例如下,测试文件是否存在:
#!/bin/bash
echo "checks the existence of the messages file."
echo -n "Checking..."
if [ -f /var/log/messages ];then
echo "/var/log/messages exists."
fi
echo
echo "...done."
操作符
比较结果
str1 = str2 |
当两个字串相等时为真 |
str1 != str2 |
当两个字串不等时为真 |
-n str1 |
当字符串的长度大于0时为真 |
-z str1 |
当字符串的长度为0时为真 |
str |
当字符串为非空时为真 |
举例如下,比较字符串来测试用户ID :
if [ "$(whoami)" != 'root' ]; then
echo "You have no permission to run $0 as non-root user."
exit 1;
fi
操作符
比较结果
num1 -eq num2 |
两数相等为真 |
num1 -ne num2 |
两数不等为真 |
num1 -gt num2 |
num1大于num2为真 |
num1 -ge num2 |
num1大于等于num2为真 |
num1 -lt num2 |
num1小于num2为真 |
num1 -le num2 |
num1小于等于num2为真 |
举例如下:
num=`wc -l work.txt`
if [ $num -gt 150 ];then
echo "you've worked hard enough for today."
echo
fi
分享到:
相关推荐
在Linux系统中,Bash Shell脚本是一种强大的自动化工具,可以执行一系列命令,极大地提高了工作效率。在某些场景下,我们可能需要在脚本中使用`sudo`命令来执行需要管理员权限的操作。通常,运行带有`sudo`的命令时...
**高级Bash Shell脚本** Bash Shell脚本是一种强大的工具,用于自动化Linux和Unix系统中的任务。它允许用户通过编写一系列命令来执行复杂的任务,而无需深入了解编程语言的复杂性。这份“高级Bash-Scripting Guide...
本文档对于十一个示例进行了bash代码的示例编写,主要面向那些没有太强的bash脚本编程基础的人,让这些人能够熟悉bash脚本的编写流程,代码规范及常规代码编写时的一些编写习惯的培养等。
- Shell脚本是解释型而非编译型的,这意味着脚本中的每一行都会被逐行解释执行,而不是先编译成机器码。 - **Shell 主要任务:** - 提供一个可配置的用户环境,允许用户通过配置文件自定义Shell的行为。 **1.1.1...
Bash shell 脚本监控 Linux 系统资源 本文将介绍如何使用 10 行 Bash shell 脚本来监控 Linux 系统的资源,包括内存、磁盘和 CPU 的使用情况。 监控内存 在 Linux 系统中,`free -m` 命令可以显示系统的内存使用...
brootkit, bash shell 脚本v0.10实现轻量级 rootkit 使用 bash shell 脚本v0.10实现的######BROOTKIT 轻量级 rootkitby wzt 2015 wzt.wzt@gmail.comIf bash shell scripts can be des
毫无疑问,UNIX/Linux 最重要的软件之一就是shell,目前最流行的shell 被称为Bash(Bourne AgainShell),几乎所有的Linux 和绝大部分的UNIX 都可以使用Bash。作为系统与用户之间的交互接口,shell几乎是你在UNIX 工作...
在这个名为"我的几个常用shell脚本"的压缩包中,包含了作者常用的Shell脚本集合,这些脚本可能涵盖日常系统管理、文件处理、数据备份等多个方面。 首先,了解Shell脚本的基本结构至关重要。一个简单的Shell脚本通常...
在IT行业中,Bash Shell脚本编程是系统管理员和运维工程师不可或缺的技能,尤其是在进行大规模自动化运维时。这个“运维 - Bash Shell 脚本编程及系统大规模自动化运维教程合集.zip”包含了丰富的学习资源,旨在帮助...
- **Bash Shell Scripting**:Bash Shell 脚本编写 Bash Shell 是 Unix 和 Linux 操作系统中广泛使用的命令解释器(shell)。Bash Shell 脚本是一种强大的工具,允许用户自动化各种任务,并执行复杂的命令序列。...
在IT行业中,Bash Shell脚本编程是一种极为重要的技能,特别是在系统运维领域。Bash(Bourne-Again SHell)是Unix/Linux操作系统中的默认shell,它提供了与系统交互、执行命令以及自动化任务的能力。本教程合集针对...
二、Shell脚本 Bash Shell不仅用于交互式操作,更常用于编写脚本,实现自动化任务。一个简单的Bash脚本通常以`#!/bin/bash`开头,声明解释器。脚本中可以包含变量定义、条件语句(if-else)、循环结构(for、while)...
总的来说,通过学习《Learning the Bash Shell》,读者将能够熟练掌握Bash shell的各个方面,无论是日常的命令行操作,还是编写复杂的shell脚本,都能游刃有余。这不仅可以提升Linux系统的使用效率,还能为成为一名...
学习这份"Advanced Bash Shell Guide",您将能够熟练地编写复杂的Shell脚本,解决日常任务,甚至构建复杂的自动化系统。在Unix和Linux环境中,Bash Shell技能是一项基础且不可或缺的工具,对于任何IT从业者而言都...
精心整理shell脚本100例(最新版).pdf
它不仅覆盖了Bash Shell的基础知识,还深入探讨了如何通过Shell脚本来解决实际问题,适合初学者到进阶用户的不同需求。 - **核心章节概览**: - **第1章:介绍**:介绍了Shell的历史背景、Bash的发展历程及其在现代...