浅浅尝试:如何新建一个shell脚本?
1、新建文件ln-test.sh
2、输入脚本即可 #! 告诉系统用什么解释器来执行
# !/bin/bash
echo "Test"
如何运行一个shell脚本?
[root@rgcc0001.cn-rockydev-1 ~ ]# sh ln-test.sh
Test
echo命令:向窗口输出文本(前面例子提到)
[root@rgcc0001.cn-rockydev-1 ~ ]# echo "Here 'this is a string' is a string"
Here 'this is a string' is a string
[root@rgcc0001.cn-rockydev-1 ~ ]# echo "Here \"this is a string\" is a string"
Here "this is a string" is a string
[root@rgcc0001.cn-rockydev-1 ~ ]# var=1
[root@rgcc0001.cn-rockydev-1 ~ ]# echo "$var"
1
# -e 开启转义
[root@rgcc0001.cn-rockydev-1 ~ ]# echo -e "OK! \n"
OK!
[root@rgcc0001.cn-rockydev-1 ~ ]# echo "test" > ln.txt
[root@rgcc0001.cn-rockydev-1 ~ ]# cat ln.txt
test
# 反引号
[root@rgcc0001.cn-rockydev-1 ~ ]# echo `ls ./`
anaconda-ks.cfg a.txt final_test.sh git ln.txt
date +%s 打印出自1970-01-01 00:00:00到当前时间的秒数
date -d: 用string方式显示时间
[root@rgcc0001.cn-rockydev-1 ~ ]# date
Sat Nov 26 23:10:20 CST 2022
[root@rgcc0001.cn-rockydev-1 ~ ]# date +%s
1669475435
(1)对全局匹配上的所有字符串进行替换
sed -i ‘s/替换前字符串/替换后字符串/g' test.txt
(2)对每行匹配到的第一个字符串进行替换
sed -i ‘s/替换前字符串/替换后字符串/' test.txt
jq命令用来处理json文件
centos下直接通过yum 安装 yum install jq -y
[root@rgcc0001.cn-rockydev-1 ]# var1=$(jq .ports test.json)
[root@rgcc0001.cn-rockydev-1 ]# echo $var1
[ { "network_id": "9febed5b-bd48-4f00-9a73-4264ed803928", "name": "net_port_1" }, { "network_id": "9febed5b-bd48-4f00-9a73-4264ed803928", "name": "net_port_2" } ]
port_sg.json内容如下:
{ "ports":
[
{
"network_id": "9febed5b-bd48-4f00-9a73-4264ed803928",
"name": "net_port_1"
},
{
"network_id": "9febed5b-bd48-4f00-9a73-4264ed803928",
"name": "net_port_2"
}
]}
(1)作用:是一个垃圾站,不要的东西丢进去,用来清除文件中的内容
[root@rgcc0001.cn-rockydev-1 ~ ]# ls >>a.txt # 将ls命令的结果输入到a.txt中
[root@rgcc0001.cn-rockydev-1 ~ ]# cat a.txt
anaconda-ks.cfg
a.txt
final_test.sh
git
[root@rgcc0001.cn-rockydev-1 ~ ]# cat /dev/null > a.txt #清空a.txt文件内容
[root@rgcc0001.cn-rockydev-1 ~ ]# cat a.txt
(2)& > /dev/null
让目前的信息不显示,就是把标准输出和错误输出重定向到/dev/null,程序不在屏幕上显示
[root@rgcc0001.cn-rockydev-1 ~ ]# ll test
ls: cannot access test: No such file or directory
[root@rgcc0001.cn-rockydev-1 ~ ]# ll test &> /dev/null #屏幕不显示错误信息
打印目录/文件的基本名称
[root@rgcc0001.cn-rockydev-1 sh_files ]# basename /root/sh_files/create_network.sh
create_network.sh
定义变量,变量名不加$,变量名和等号之间没有空格
{}可选,为的是更好是别变量边界。
使用变量时,变量名才加$
[root@rgcc0001.cn-rockydev-1 ~ ]# cat ln-test.sh
# !/bin/bash
TEST="ln_test"
echo ${TEST}
echo $TEST
[root@rgcc0001.cn-rockydev-1 ~ ]# sh ln-test.sh
ln_test
ln_test
用语句可以给变量赋值
[root@rgcc0001.cn-rockydev-1 ~ ]# cat ln-test.sh
# !/bin/bash
TEST=`ls /root/`
echo ${TEST}
echo $TEST
[root@rgcc0001.cn-rockydev-1 ~ ]# sh ln-test.sh
anaconda-ks.cfg a.txt create_network.sh create_port_test.sh
anaconda-ks.cfg a.txt create_network.sh create_port_test.sh
该例将/root/下目录的文件名复制给变量TEST
单引号里任何字符原样输出,忽略所有的命令以及特殊字符(不解析特殊字符)
[root@rgcc0001.cn-rockydev-1 ~ ]# echo 'string'
string
[root@rgcc0001.cn-rockydev-1 ~ ]# echo 'ls ./'
ls ./
双引号内可以有变量,可以有转义字符(会解析特殊字符,包括` $ \),如果要忽略特殊字符,可以用\来转义,作为普通字符来输出。
[root@rgcc0001.cn-rockydev-1 ~ ]# var=1
[root@rgcc0001.cn-rockydev-1 ~ ]# echo '$var'
$var
[root@rgcc0001.cn-rockydev-1 ~ ]# echo "$var"
1
# 如果想输出 $var
[root@rgcc0001.cn-rockydev-1 ~ ]# echo "\$var"
$var
[root@rgcc0001.cn-rockydev-1 ~ ]# cat ln-test.sh
# !/bin/bash
TEST="ln_test"
test1="test1,"$TEST" "
test2="test2,"${TEST}" "
echo $test1
echo $test2
[root@rgcc0001.cn-rockydev-1 ~ ]# sh ln-test.sh
test1,ln_test
test2,ln_test
1、使用&,让命令在后台运行
在命令末尾加上&
2、再在done之后加上wait命令,该命令等待当前脚本进程下的子进程结束再运行后面语句
NET_SEQ=2
for i in `seq 1 $NET_SEQ`;
do {
openstack network create test_net_${i} &>/dev/null
} &
done
wait
加减乘除,乘法前要加转义字符
[root@rgcc0001.cn-rockydev-1 ~ ]# echo `expr $var1 + $var2`
30
[root@rgcc0001.cn-rockydev-1 ~ ]# echo `expr $var1 - $var2`
-10
[root@rgcc0001.cn-rockydev-1 ~ ]# echo `expr $var1 \* $var2`
200
[root@rgcc0001.cn-rockydev-1 ~ ]# echo `expr $var1 / $var2`
0
现象:
[root@rgcc0001.cn-rockydev-1 ~ ]# cat ln-create.sh
NET_NUM=4
# Creating networks and subnets
for net_num in {0..$NET_NUM};
do {
echo net_num=$net_num;
}
done
[root@rgcc0001.cn-rockydev-1 ~ ]# sh ln-create.sh
net_num={0..4}
解决方案:
[root@rgcc0001.cn-rockydev-1 ~ ]# cat ln-create.sh
# 修改该行即可
for net_num in `seq 1 $NET_NUM`;
...
[root@rgcc0001.cn-rockydev-1 ~ ]# sh ln-create.sh
net_num=1
net_num=2
net_num=3
net_num=4