特殊变量
名称 | 说明 |
---|---|
$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 except
,vim except.sh
,chmod u+x except.sh
如果直接安装expect失败,可以手动安装
- 下载tcl:
wget http://sourceforge.net/projects/tcl/files/Tcl/8.4.19/tcl8.4.19-src.tar.gz/download
- 解压tcl并进入unix:
tar -zxvf download
,cd tcl/unix
- 安装tcl:
sudo ./configure
,sudo make
,sudo make install
- 下载expect:
wget http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz
- 解压expect:
tar -zxvf expect-
- 安装expect:
sudo ./configure --with-tclinclude=/usr/local/src/tcl8.4.19/generic/ --with-tclconfig=/usr/local/lib/
,sudo make
,sudo 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