【Linux】Shell脚本

特殊变量

名称 说明
$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

替换文件夹中所有文件文本

# 将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

ssh-keygen -t rsa
cd ~/.ssh
ssh-copy-id -i 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----------"

你可能感兴趣的:(………Linux)