【Linux】Shell脚本

本文深入探讨Shell脚本中的特殊变量、条件表达式、HTTP请求处理、字符串操作、文件读写及权限控制等核心功能。通过实例展示了如何进行文件比较、字符串匹配、算术运算、JSON解析、文本替换及多线程远程执行脚本等实用技能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

特殊变量
名称说明
$0脚本名称
$1-9脚本执行时的参数1到参数9
$?脚本的返回值
$#脚本执行时,输入的参数的个数
$@输入的参数的具体内容(将输入的参数作为一个多个对象,即是所有参数的一个列表)
$*输入的参数的具体内容(将输入的参数作为一个单词)

$@$*的区别:

  • $@$*都可以使用一个变量来来表示所有的参数内容,但这两个变量之间有一些不同之处。
  • $@:将输入的参数作为一个列表对象
  • $*:将输入的参数作为一个单词

参考:http://www.cnblogs.com/zhuandshao/p/7193564.html


判断表达式

文件比较运算符

代码说明举例
e filename如果 filename存在,则为真[ -e /var/log/syslog ]
-d filename如果 filename为目录,则为真[ -d /tmp/mydir ]
-f filename如果 filename为常规文件,则为真[ -f /usr/bin/grep ]
-L filename如果 filename为符号链接,则为真[ -L /usr/bin/grep ]
-r filename如果 filename可读,则为真[ -r /var/log/syslog ]
-w filename如果 filename可写,则为真[ -w /var/mytmp.txt ]
-x filename如果 filename可执行,则为真[ -w /var/mytmp.txt ]
filename1-nt filename2如果 filename1比 filename2新,则为真 如[ /tmp/install/etc/services -nt /etc/services ]
filename1-ot filename2如果 filename1比 filename2旧,则为真[ /boot/bzImage -ot arch/i386/boot/bzImage ]

字符串比较运算符

代码说明举例
-z string如果 string长度为零,则为真[ -z “$myvar” ]
-n string如果 string长度非零,则为真[ -n “$myvar” ]
string1= string2如果 string1与 string2相同,则为真["$myvar" = “one two three”]
string1!= string2如果 string1与 string2不同,则为真["$myvar" != “one two three”]

算术比较运算符

代码说明举例
num1-eq num2等于[ 3 -eq $mynum ]
num1-ne num2不等于[ 3 -ne $mynum ]
num1-lt num2小于[ 3 -lt $mynum ]
num1-le num2小于或等于[ 3 -le $mynum ]
num1-gt num2大于[ 3 -gt $mynum ]
num1-ge num2大于或等于[ 3 -ge $mynum ]

参考:https://blog.csdn.net/tiantang_1986/article/details/78281432


获取http返回值
#/bin/bash
RESULT=`curl -X POST "http://localhost:8080/rest/test?name=123"`
echo $RESULT

截取字符串
#/bin/bash
RESULT=`curl -X POST "http://localhost:8080/rest/test?name=123"`
#RESULT=11-22
FIRST=`echo $RESULT | cut -d '-' -f 1`
SECOND=`echo $RESULT | cut -d '-' -f 2`
echo $FIRST
echo $SECOND

判断文件包含文本
#/bin/bash
cat /opt/test.out | while read line
do 
	var=${line}
	echo 'var---'$var
	if [[ "$var" =~ "aaa" ]]
	then
		echo "$var includ aaa"
	elif [[ "$var" =~ "bbb" ]]
	then
		echo "$var includ bbb"
	else
		echo "nothing includ"
	fi
done


解析json
#/bin/bash
RESULT=`curl -X POST "http://localhost:8080/test"`
STATUS=`echo $RESULT | jq '.status'`
if [ $STATUS -eq 200 ];then
        NAME=`echo $RESULT | jq '.meta' | jq '.name'`
        GENDER=`echo $RESULT | jq '.meta' | jq '.gender'`
        echo $NAME
        echo $GENDER
        echo $NAME > /opt/name.json
        echo '生成name文件'
else
        echo "status: $STATUS -- something wrong"
fi

替换文本
#/bin/bash
ORIGINAL=`openssl ec -in server-ecc.key -text -noout`
echo $ORIGINAL | sed 's/://g' | sed 's/00//g' | sed 's/04//g' > server-ecc.txt

替换引号和\n
sed -i "s/\"//g" /opt/test.txt
sed -i "s/\\\n/\n/g" /opt/test.txt

替换文件夹中所有文件文本
# 将data文件下所有文件中8080替换为8088
sed -i "s/8080/8088/g" `grep 8080 -rl /data`
sed -i "s/old/new/g" `grep old -rl /folder`

读取配置文件
#/bin/bash
# 配置文件内容: test.host=10.0.0.1
HOST=`cat $PDX_HOME/conf/node.conf | grep "test.host" | awk -F'=' '{ print $2 }' | sed s/[[:space:]]//g`
echo $HOST

停止项目
#/bin/bash
PROJECT_NAME="test"
PID_LIST=`ps -ef | grep $PROJECT_NAME | grep -v grep | awk '{print $2}'`
if [ "$PID_LIST" = "" ]
        then
        echo "--- no $PROJECT_NAME pid alive"
else
        echo "--- $PROJECT_NAME list :$PID_LIST"
        kill  $PID_LIST
        echo "--- $PROJECT_NAME stop success"
fi

重建数据库
#!/bin/bash

ACCOUNT=root
PASSWORD=root

# delete database
mysql -h127.0.0.1 -u$ACCOUNT -p$PASSWORD -e "drop database aaa;"

# create database
mysql -h127.0.0.1 -u$ACCOUNT -p$PASSWORD -e "create database aaa default character set utf8mb4 collate utf8mb4_unicode_ci;"

免密登陆
#!/bin/bash

IP=$1
SSH_KEY_FOLDER=/root/.ssh

# generate ssh key
if [ ! -f ${SSH_KEY_FOLDER}/id_rsa.pub ]; then
	echo 'Start to generate ssh key ...'
	# no need to input password for ssh-key
	ssh-keygen -f ${SSH_KEY_FOLDER}/id_rsa -t rsa -N ''
	# input password for ssh-key
	#ssh-keygen -t rsa
fi

# copy ssh-public-key to target ip
echo "Start to copy pub-key to ${IP} ..."
ssh-copy-id -i ${SSH_KEY_FOLDER}/id_rsa.pub root@${IP}


多线程远程执行脚本
#!/bin/bash

echo "----------START----------"
for line in $(cat server_ip.txt); do
{
	echo "----------ip:$line start----------"
	scp say-hello.sh root@$line:/root
	eval "ssh root@$line 'sh /root/say-hello.sh'"
	echo "----------ip:$line end----------"
}&
done
echo "----------END----------"

备份文件
#!/bin/bash

FILE_NAME=aa.jar
FILE_PATH=/data/app/test
DATE=`date +%F`
BAK_NAME=${FILE_NAME}.bak.${DATE}
TEMP_NAME=$BAK_NAME

for((i=1;i<=10;i++));
do
	if [ -f "${FILE_PATH}/${BAK_NAME}" ];then
		BAK_NAME=${TEMP_NAME}.${i}
	else
		cp ${FILE_PATH}/${FILE_NAME} ${FILE_PATH}/${BAK_NAME}
		break
	fi
done


自动输入账户密码
#!/usr/bin/expect -f

set IP [lindex $argv 0]
set USER [lindex $argv 1]
set PASSWORD [lindex $argv 2]

set timeout 30
#spawn ssh ${USER}@${IP}
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@${IP}

# send commond
expect {
	"yes/no" { send "yes\r"}
}
expect {
	"password" { send "${PASSWORD}\r";exp_continue}
}

# stay on remote console
#interact

需要安装expect并对脚本授权:apt install exceptvim except.shchmod u+x except.sh

如果直接安装expect失败,可以手动安装

  1. 下载tcl:wget http://sourceforge.net/projects/tcl/files/Tcl/8.4.19/tcl8.4.19-src.tar.gz/download
  2. 解压tcl并进入unix:tar -zxvf download, cd tcl/unix
  3. 安装tcl:sudo ./configuresudo makesudo make install
  4. 下载expect:wget http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz
  5. 解压expect:tar -zxvf expect-
  6. 安装expect:sudo ./configure --with-tclinclude=/usr/local/src/tcl8.4.19/generic/ --with-tclconfig=/usr/local/lib/sudo makesudo make install

参考: https://blog.csdn.net/shimadear/article/details/93972559


占用内存
#!/bin/bash  

# 1024M
data_size=$1

mkdir /tmp/memory  
mount -t tmpfs -o size=${data_size} tmpfs /tmp/memory  
dd if=/dev/zero of=/tmp/memory/block  
sleep 3600  
rm /tmp/memory/block  
umount /tmp/memory  
rmdir /tmp/memory  

参考: https://blog.csdn.net/cangencong/article/details/74328944

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值