shell命令合集(loading)

零、初试

浅浅尝试:如何新建一个shell脚本?
1、新建文件ln-test.sh
2、输入脚本即可 #! 告诉系统用什么解释器来执行

# !/bin/bash
echo "Test"

如何运行一个shell脚本?

[root@rgcc0001.cn-rockydev-1 ~ ]# sh ln-test.sh
Test

一、命令合集

1、echo命令

echo命令:向窗口输出文本(前面例子提到)

(1)显示字符串(普通字符串、转义字符)

[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

(2)显示变量

[root@rgcc0001.cn-rockydev-1 ~ ]# var=1
[root@rgcc0001.cn-rockydev-1 ~ ]# echo "$var"
1

(3)显示换行

# -e 开启转义
[root@rgcc0001.cn-rockydev-1 ~ ]# echo -e "OK! \n"
OK! 

(4)结果定向至文件

[root@rgcc0001.cn-rockydev-1 ~ ]# echo "test" > ln.txt
[root@rgcc0001.cn-rockydev-1 ~ ]# cat ln.txt 
test

(5)显示命令执行结果

# 反引号
[root@rgcc0001.cn-rockydev-1 ~ ]# echo `ls ./`
anaconda-ks.cfg a.txt final_test.sh git ln.txt

2、date命令

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

3、sed命令

(1)对全局匹配上的所有字符串进行替换

sed -i ‘s/替换前字符串/替换后字符串/g' test.txt

(2)对每行匹配到的第一个字符串进行替换

sed -i ‘s/替换前字符串/替换后字符串/' test.txt

4、jq命令

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"
    }
]}

5、cut命令

6、/dev/null

(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 #屏幕不显示错误信息

7、basename命令

打印目录/文件的基本名称

[root@rgcc0001.cn-rockydev-1 sh_files ]# basename /root/sh_files/create_network.sh 
create_network.sh

二、关于变量

1、变量的定义

1.1 直接赋值给变量

定义变量,变量名不加$,变量名和等号之间没有空格
{}可选,为的是更好是别变量边界。
使用变量时,变量名才加$

[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

1.2 语句赋值给变量

用语句可以给变量赋值

[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

2、shell字符串

2.1 单引号

单引号里任何字符原样输出,忽略所有的命令以及特殊字符(不解析特殊字符)

[root@rgcc0001.cn-rockydev-1 ~ ]# echo 'string'
string
[root@rgcc0001.cn-rockydev-1 ~ ]# echo 'ls ./'
ls ./

2.2 双引号

双引号内可以有变量,可以有转义字符(会解析特殊字符,包括` $ \),如果要忽略特殊字符,可以用\来转义,作为普通字符来输出。

[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

三、for循环和并发

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

四、运算符

1、算术运算符

加减乘除,乘法前要加转义字符

[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

2、关系运算符

五、if语句

八、问题记录

1、如何避免for i in {0…$i}输出i异常?

现象:

[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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值