[转]shell脚本命令和用法

$#:代表命令行参数个数

$*:代表所有参数

$n:第n个参数

$?:代表最后一个命令返回值

$$:代表当前shell的进程号PID

$是变量的引用符

 

= 是最基本的赋值

:= 是覆盖之前的值

?= 是如果没有被赋值过就赋予等号后面的值

+= 是添加等号后面的值

 

declare: //定义变量


declare -a array //数组

declare -i sum=10+20 //整型

declare -x var //定义为环境变量

declare -r var=456 //定义为只读的变量 不能用unset

 

read 命令: //从键盘读入数据,赋值给变量;


-x read 时显示脚本执行的过程(用于调试) 执行脚本时也可加-x

-t read -t 2 tmp 2秒钟超时

-n read -n 3 tmp 读入3个字符自动返回

-p read -p "please input " <<====> echo -n "please input : "

-s read -p "please input :" -s passwd 以密码形式读入

伪代码用例

declare -i score //定义一个变量
 
read -p "input a int score:" score
 

echo 命令


echo -n "hello world" 不输出回车符

echo -e "\033[31mking\033[0m" 支持终端控制码命令m颜色属性
30--37前景色
40-----47 背景色

\033[0m恢复默认颜色属性

\033[45;36m设置背景为45前景为36

"\033[y;xH \033[10;25h" 把光标置于10行25列处

\033[K 清除光标行的内容

\033[u 恢复光标位

\033[s 保存当前光标位

 

test

// 与文件存在与否的判断
-e 是否存在
-f 是否为普通文件
-d 是否为目录
-s 是否为非空的文件
-p 是否为管道文件
-b 是否为块设备文件
-c 是否为字符设备文件
-L 是否为软链接
-S 是否Socket文件


//与文件权限有关的判断
-r 是否有可读的权限
-w 是否有可写的权限
-x 是否有可执行权限
-u 是否有特权位
-g 是否有组特权位
-k 是否有t位,即粘贴位


//两个文件的比较判断
-nt 比较file1比file2新
-ot 比较file1比file2旧
-ef 比较file1和file2是否为同一个文件,一般用于判断硬链接


//整数之间的大小判断
-eq 相等
-ne 不等于
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于


//字符串之间的判断
-z 是否为空字符串
-n 是否为非空字符串
str1 = str2 是否相等
str1 != str2 是否不等
test -d file 测试是否为目录
test -e file 是否存在
test -s file 文件大小是否不为0


//多重条件判断
-a 两个条件同时满足,就为真,相当于and
-o 两个条件满足其一,就为真,相当于or

 

(()) 也可判断和test一样,可以直接使用比较符号,支持C语言格式

 

 

regular变量的特殊其它引用及处理方法


$var 引用var变量的值
${var} 引用var变量的值
${var%a*} 引用var变量的值并且截取a左边的字符串显示,如果字符串有多个a,则按从左向右最后一个a截取
${var%%a*} 引用var变量的值并且截取a左边的字符串显示,如果字符串有多个a,则按从左向右第一个a截取
${var#*a} 引用var变量的值并且截取a右边的字符串显示,如果字符串有多个a,则按从左向右第一个a截取
${var##*a} 引用var变量的值并且截取a右边的字符串显示,如果字符串有多个a,则按从左向右最后一个a截取
${var:3} 引用var变量的值并且从第3个字符开始截取
${var:3:6} 引用var变量的值并且从第3个字符开始截取,截取6个字符显示
${#var} 返回var变量值的长度
${var/a/b} 替换变量值的字符串,这里是把var变量值里的a换成b,如果有多个a也只能换一次
${var//a/b} 替换变量值的字符串,这里把var变量值里的a全换成b


if的各种形式


if test 6 -eq 5 -a 7 -gt 8
if [ 6 -eq 5 ] && [ 7 -gt 8 ]
if [ 6 -eq 6 -a 9 -gt 8 ]
if test 6 -eq 5
if ((6==5))
if test $score -lt 0 -o $score -gt //100小于0或者大于100

 

 

用法:

求变量的长度

 

len=${#num}
求出字符串的长度

    expr length "this is a test" 
 
    
    14 //输出

 

数字商数 模运算

expr 14 % 9
    5 //输出

 

从位置处抓取字串

expr substr "this is a test" 3 5 //遇到空格停止
     is is //输出

 

数字串 only the first character 字符e第一次出现在串的位置

expr index "testforthegame" e
    2 //输出

 

产生1000以内的随机数

num=$(($RANDOM % 1000))
 

检查是否为整数

expr $num + 100 &> /dev/null //不显示任何东西
if [ $? -ne 0 ]
then
    echo "input error!"
    exit 1
fi
 

检测用户是否存在

#!/bin/bash
 
 
 
if [ $? -ne 0 ]
 
then
 
  echo "user nonexistent"
 
  exit 1
 
fi
 
echo "$uid"
 
exit 0
 
 
 
#-n表示位数
 
read -p "input a key:" :-n 1 key
 

判断某个文件是否存在,如果存在则判断是否为空文件 如果为空实现删除

#./xxx.sh /var/ftp/pub/ttt.txt
if [ $# -ne 1 ]
then
    echo -e "\033[31muse:$0 filePath\033[0m"
    exit 1
fi
#是否存在 '!'取假
fname=$1
if ! test -e $fname
then
    echo -e "\033[31m$fname is not exist\033[0m"
    exit 2
fi
#判度是否为普通文件
if [ -f $fname ] #if test -f $fname
then
#判断是否为空文件
if ! test -s $fname
then
    rm -rf $fname
if [ $? -eq 0 ]
then
    echo "$fname is empty file,del..."
fi
fi
else
    echo "is not file!!!"
fi
 
exit 0
 

输入某个IP 并测试是否可一通信 如果能打印YES 否则NO

read -p "input a ip:" ip
#检查IP是否合法
ping -c 1 $ip &> /dev/null
if [ $? -eq 0 ]
then
    echo "Yes."
else
    echo "NO."
fi
 

检查输入是否为数字

read -p "input a int number:" num
len=${#num}
for i in $(seq 0 $((len-1)))
do
n=${num:$i:1}
case $n in
[[:digit:]])
;;
*)
echo "input error!!!"
exit 1
;;
esac
 
done
 

将当前目录下所有的.txt文件都改成.doc

#!/bin/bash
 
FILES='ls ./*.txt'
 
for txt in $FILES
 
do
 
     doc='echo $txt | sed "s/.txt/.doc"'
 
     mv  $txt  $doc
 
done
 

设计一个shell程序,备份并压缩/etc目录的所有内容,存放在/root/bak目录里,且文件名为如下形式yymmdd_etc,yy为年,#mm为月,dd为日

#! /bin/bash
 
DIRNAME='ls /root| grep bak'
 
if [ -z "$DIRNAME" ]
 
then
 
    mkdir /root/bak
 
    cd /root/bak
 
fi
 
YY='date % y'
 
MM='date % m'
 
DD='date % d'
 
BACKETC=$YY$MM$DD_etc.tar.gz
 
tar -zcvf $BACKETC /etc
 

Reference:

https://blog.csdn.net/haofeng_ma/article/details/80864799

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值