一些常见的预定义变量的含义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
预定义的变量是由Shell自身维护的特殊变量,它们通常保存了一些特定的系统信息。

$HOME:当前用户的主目录。

$USER:当前用户的用户名。

$PATH:可执行文件的搜索路径。

$PWD:当前工作目录。

$OLDPWD:前一个工作目录。

$SHELL:当前使用的Shell。

$?:最后执行的命令的退出状态(返回值)。

$$:当前Shell的进程ID。

$!:最后运行的后台命令的进程ID。

$#:传递给脚本或函数的参数个数。

$@:以独立字符串显示每个参数。

获取变量长度的常用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
echo ${#变量名}
输出变量的长度(必须大括号包起来)

或wc -L也可以获取长度

如:echo $变量名|wc -L

wc -l 获取行数
例:cat /var/log/messages
或wc -l </var/log/messages

wc的一些比较常用的参数:
-c, --bytes:统计字节数。

-m, --chars:统计字符数。

-w, --words:统计字数。

-l, --lines:统计行数。

-L, --max-line-length:统计最长行的长度。

测试主机某端口放开情况的一些方法

1
2
3
4
5
6
7
8
9
echo &>/dev/null  >/dev/tcp/192.168.100.50/23 测试别的主机的端口是否可达
&>/dev/null >/dev/tcp/192.168.100.50/23
(可以不加echo,&>/dev/null不可以放后边,放后边失败依然会有回显)

telnet IP port 如:telnet 192.168.100.50 23(成功的话会不好退出,测试不建议使用这个)

nc -z -w2 192.168.100.50 22
-z 只用于测试,不发送任何数据,无论成功与否不会有任何回显。
-w2 超时时间,如果超过2秒没有反馈,则认为该端口没有放开。

if中判断正则一些符号和参数的解释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if  [ ${#passwd} -gt 8 ]  && [[ ${passwd} =~ [a-z] ]] && [[ ${passwd} =~ [A-Z] ]]
if [[ $IP =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]
if [[ "$number" =~ ^[0-9]+$ ]] && [ "$number" -ne 0 ]
if [[ $num =~ ^[1-9][0-9]*$ ]] #表示第一个数字匹配1-9之间的数字,之后匹配任意数量的数字(包括零个数字)0-9之间的数字。

${#passwd} 表示变量passwd的长度
=~ 是 Bash 中用来进行正则表达式匹配的操作符
^ 表示匹配输入字符串的开始位置。
[0-9]{1,3} 表示一个由1到3个数字(0-9之间的任意数字)组成的匹配模式。
[0-9]+ 表示匹配一个或多个数字(0到9之间的任意数字),至少匹配一个数字。
[0-9]* 表示匹配任意数量的数字(包括零个数字)。
$ 表示匹配输入字符串的结束位置。
正则表达式是需要用[[]]包起来,[[]]能用正则,而[]不行。
不能直接将 && 换成 -a,因为 [[ ]] 结构不支持 -a。尽管条件一不是[[]]结构!
.表示匹配任意字符

-a用来连接多个条件判断的逻辑与
&& 是逻辑与操作符,用于连接命令或者条件判断,表示前一个命令或条件成功后,才会执行后面的命令或条件。

回车符和换行符解释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1. 回车符(\r):这个符号用于表示光标返回到当前行的开头,如果有新的字符输入,将覆盖已存在的字符。在shell命令中,\r可以用于在同一行上连续输出不同的内容,例如:

echo -e “Hello\rWorld”

输出结果为:World。

2. 换行符(\n):这个符号用于表示光标移至下一行的开头,如果有新的字符输入,将在新的行上输出。在shell命令中,\n可以用于将一行分割成多行以提高可读性,例如:

echo -e “This is line 1.\nThis is line 2.”

输出结果为:

This is line 1.
This is line 2.

for循环的常见写法

下面以求1到5的和为例

1
2
3
4
5
6
7
8
9
#从范围中取值
sum=0
for i in {1..5}
#for i in 192.168.174.{2..254} 增加了前缀
#for i in `seq -w 0 05` -w:表示宽度,它会在生成的数字前面补零,以保证输出的宽度一致。
do
let sum=$sum+$i
done
echo $sum
1
2
3
4
5
6
sum=0
for i in `seq 1 1 5` #表示在1-5中取值,中间的1表示间隔为1的取值,不写默认为1
do
let sum=$sum+$i
done
echo $sum
1
2
3
4
5
6
sum=0
for((i=1;i<=5;i++))
do
let sum=$sum+$i
done
echo $sum
1
2
3
4
5
6
7
8
#设置池,从池中读取值
sum=0
port="1 2 3 4 5"
for i in $port
do
let sum=$sum+$i
done
echo $sum
1
2
3
4
5
6
7
8
#从文件中读取
sum=0
read -p "请输入文件路径:" file
for i in `cat $file`
do
let sum=$sum+$i
done
echo $sum

for循环范例和两种无交互修改密码的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#范例:新建10个用户给他们设置随机密码并将用户名密码记录到/tmp/userpassword文件中
for u in `seq -w 0 09`
do
#创建用户
useradd user_$u
#生成密码
p=`mkpasswd -s 0 -l 10`
#-s 参数用于指定密码中特殊字符的最少位数,设置为0表示不要求密码中包含特殊字符
#-l 参数表示密码长度为10位
#从标准输入中读取密码进行修改(不安全)
echo $p|passwd --stdin user_$u
#常规修改密码
echo -e "$p\n$p"|passwd user_$u
#将创建的用户及对应的密码记录到日志文件中
echo "user_$u $p" >> /tmp/userpassword
done

while循环的常见写法

1
2
3
4
5
#常规while循环
while 条件测试操作
do
命令序列
done
1
2
3
4
5
#while的死循环
while :
do
循环体
done
1
2
3
4
5
6
7
8
9
10
11
12
13
#while循环+read读取文件(其为一行一行读取进行循环)
while read 变量
do
循环体
done <文件路径


cat 文件路径 |while read 变量
do
循环体
done

两种写法均可实现读取文件的效果!!!

cat和重定向结合使用的几种形式

1
2
3
4
5
6
7
8
9
10
11
12
13
cat > file:
将输入重定向到文件,并覆盖原有内容。即将用户在终端中输入的内容写入文件中,并覆盖文件中原有的内容。
**举例来说,执行命令cat > example.txt,然后输入一些文本内容并按下回车键,输入完成后使用 Ctrl+D 结束输入,此时该文本内容就被覆盖写入了example.txt文件中。

cat < file << EOF:
从文件中读取输入,并直到遇到EOF(End Of File)为止。即从指定的文件中读取内容,并将其传递给cat命令作为标准输入,直到遇到EOF时结束输入。EOF是自定义的结束标识符,可以使用任意字符或字符串代替,只需保证开始和结束时使用相同的字符或字符串即可。

**举例来说,执行命令cat << EOF,然后在终端中输入一些文本内容并按下回车键,然后输入EOF作为结束标识符,输入完成后使用 Ctrl+D结束输入,此时该文本内容就被作为标准输入传递给了cat命令。

cat <<- EOF:
从文件中读取输入,并直到遇到EOF为止。和上述方式类似,区别在于在EOF前添加了一个“-”号,表示忽略所有的前导制表符(Tab)字符。`这个方式通常用于在shell脚本中输入多行文本内容。用来打印菜单,常与case结合使用`

**举例来说,执行命令cat <<- EOF,然后在终端中输入一些文本内容并按下回车键,然后输入EOF作为结束标识符,输入完成后使用 Ctrl+D结束输入,此时该文本内容就被作为标准输入传递给了cat命令,并忽略了所有的前导制表符(Tab)字符。

利用grep或egrep过滤文件中的空行和注释行(常用)

1
2
3
4
[root@mycat 2024-07-29]# egrep -v "^(#|$)" /etc/rc.d/rc.local  #过滤注释行和空行
touch /var/lock/subsys/local

或[root@mycat ~]# grep -vE "^($|#)" anaconda-ks.cfg

sed使用实例的详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
sed -e "s|^mirrorlist=|#mirrorlist=|g" \
-e "s|^#baseurl=http://mirror.centos.org/centos/\$releasever|baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos-vault/6.10|g" \
-e "s|^#baseurl=http://mirror.centos.org/\$contentdir/\$releasever|baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos-vault/6.10|g" \
-i.bak \
/etc/yum.repos.d/CentOS-*.repo

详解如下:
-e 多重编辑
-e "s|^mirrorlist=|#mirrorlist=|g" 这个部分用于注释掉以 mirrorlist= 开头的行,将其替换为#mirrorlist=。这样做的目的是禁用使用镜像列表的方式获取软件包信息。

-e "s|^#baseurl=http://mirror.centos.org/\$releasever|baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos-vault/6.10|g" 这个部分用于替换以 #baseurl=http://mirror.centos.org/\$releasever 开头的行,将其替换为指向清华大学 TUNA 镜像站点的 URL。$releasever 将会被当前 CentOS 版本号替换。

-e "s|^#baseurl=http://mirror.centos.org/\$contentdir/\$releasever|baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos-vault/6.10|g" 这个部分用于替换以 #baseurl=http://mirror.centos.org/\$contentdir/\$releasever 开头的行,同样将其替换为指向清华大学 TUNA 镜像站点的 URL。这里也使用了 $contentdir 和 $releasever 的变量,会被相应的值替换。

-i.bak:这个选项让 sed 在编辑文件时备份原始文件,备份文件的扩展名为 .bak。

/etc/yum.repos.d/CentOS-*.repo:这是指定要操作的目标文件,它匹配所有以 CentOS- 开头且以 .repo 结尾的文件名,通常是 CentOS YUM 仓库的配置文件。

每一行末尾的反斜杠 \ 是用来续行的标记。在Shell脚本或命令行中,反斜杠 \ 可以用来告诉解释器,当前行的命令在下一行继续。这是为了提高可读性,尤其是当命令很长时。