Shell_基础学习

2019-07-24  本文已影响0人  古佛青灯度流年

项目

学习笔记

基本命令

命令 用法含义
$$ 获取当前进程PID
$# 返回参数的数量
$! 最后运行的后台进程的PID
1-n 返回第一个参数、到第n个参数值
$@ 返回全部参数
$? 返回上一个命令执行的结果,0:执行成功;1:执行失败
| 单竖线,将‘|’前面命令的输出作为'|'后面的输入
|| 双竖线分割的多条命令,执行的时候遵循如下规则,如果前一条命令为真,则后面的命令不会执行,如果前一条命令为假,则继续执行后面的命令。
& &同时执行多条命令,不管命令是否执行成功
&& && 可同时执行多条命令,当碰到执行错误的命令时,将不再执行后面的命令。如果一直没有错误的,则执行完毕。
exit 退出当前进程,命令可以接受一个整数值作为参数,代表退出状态。如果不指定,默认状态值是 0。0 表示成功,非0表示失败 例如:echo "befor exit" exit 8 echo "after exit" echo "$?" 结果为 befor exit 8
-z if表达式[ -z $string ] 如果string 为空则为真
-n if表达式[ -n $string ] 如果string 非空(非0),返回0(true)
-s if表达式[ -s FILE ] 如果 FILE 存在且大小不为0则为真。
-a if表达式[ -a FILE ] 如果 FILE 存在则为真。

if语句

if [ command ];then
     符合该条件执行的语句
elif [ command ];then
     符合该条件执行的语句
else
     符合该条件执行的语句
fi

数值判断

[ INT1 -eq INT2 ] INT1和INT2两数相等返回为真 ,=
[ INT1 -ne INT2 ] INT1和INT2两数不等返回为真 ,<>
[ INT1 -gt INT2 ] INT1大于INT2返回为真 ,>
[ INT1 -ge INT2 ] INT1大于等于INT2返回为真,>=
[ INT1 -lt INT2 ] INT1小于INT2返回为真 ,<
[ INT1 -le INT2 ] INT1小于等于INT2返回为真,<=

#*,##*,% *,%% *的含义及用法

假设定义了一个变量为:
代码如下:
file=/dir1/dir2/dir3/my.file.txt
可以用${ }分别替换得到不同的值:
${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:删掉最后一个 /  及其左边的字符串:my.file.txt
${file#*.}:删掉第一个 .  及其左边的字符串:file.txt
${file##*.}:删掉最后一个 .  及其左边的字符串:txt
${file%/*}:删掉最后一个  /  及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:删掉第一个 /  及其右边的字符串:(空值)
${file%.*}:删掉最后一个  .  及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:删掉第一个  .   及其右边的字符串:/dir1/dir2/dir3/my
记忆的方法为:
# 是 去掉左边(键盘上#在 $ 的左边)
% 是去掉右边(键盘上% 在$ 的右边)
单一符号是最小匹配;两个符号是最大匹配
${file:0:5}:提取最左边的 5 个字节:/dir1
${file:5:5}:提取第 5 个字节右边的连续5个字节:/dir2
也可以对变量值里的字符串作替换:
${file/dir/path}:将第一个dir 替换为path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部dir 替换为 path:/path1/path2/path3/my.file.txt

符号$后的括号

标准输入、标准输出、标准错误

/dev/null 代表空设备文件
> 代表重定向到哪里,例如:echo "123" > /home/123.txt
1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
2 表示stderr标准错误
& 表示等同于的意思,2>&1,表示2的输出重定向等同于1
重定向的使用有如下规律:
1)标准输入0、输出1、错误2需要分别重定向,一个重定向只能改变它们中的一个。
2)标准输入0和标准输出1可以省略。(当其出现重定向符号左侧时)
3)文件描述符在重定向符号左侧时直接写即可,在右侧时前面加&。
4)文件描述符与重定向符号之间不能有空格!
eg:
command <   filename  >   filename2     把标准输入重定向到filename文件中,把标准输出重定向到filename2文件中
command 0<  filename 1>   filename2     把标准输入重定向到filename文件中,把标准输出重定向到filename2文件中
command >   filename 2>&1               把标准输出和标准错误一起重定向到filename文件中(覆盖)
command >>  filename 2>&1               把标准输出和标准错误一起重定向到filename文件中(追加)
command <   filename                    把标准输入重定向到filename文件中
command 0<  filename                    把标准输入重定向到filename文件中
command >   filename                    把标准输出重定向到filename文件中(覆盖)
command 1>>  fielname                   把标准输出重定向到filename文件中(追加)

软连接

    ln –s 源文件 目标文件

等号与双等号的区别

s1="foo"
s2="foo"
[ $1=$2 ] && echo "equal"
[ $1==$2 ] && echo "equal"
((a=5))
echo $a  # 此时为赋值操作
((a==5)) && echo "equal"    # 此时表示判断

单引号和双引号的区别

#!/bin/bash
url="http://c.biancheng.net"
website1='C语言中文网:${url}'
website2="C语言中文网:${url}"
echo $website1
echo $website2
运行结果:
C语言中文网:${url}
C语言中文网:http://c.biancheng.net

小括号与大括号区别

小括号()

①命令组。括号中的命令新开一个子shell程序,括号中的变量为本地变量 ,不能够在脚本其他部分使用。括号中多个命令之间用分号隔开。
备注:
在括号中的变量,由于是在子shell中,所以对于脚本剩下的部分是不可用的.
父进程, 也就是脚本本身, 将不能够读取在子进程中创建的变量, 也就是在子shell中创建的变量.

(cmd1;cmd2;cmd3)

②命令替换。命令替换(cmd)等同于`cmd`(这不是单引号,`是ESC下面的那个键) ,shell执行过程中发现了(cmd)结构,便将$(cmd)中的cmd执行一次,得到其输出,再将此输出放到原来命令。例如:

[root@localhost tmp]# ls
fstab  functions  hellobash  issue  mytestdir  scripts
[root@localhost tmp]# echo $(ls)
fstab functions hellobash issue mytestdir scripts
[root@localhost tmp]# echo `ls`
fstab functions hellobash issue mytestdir scripts

③用于初始化数组。如:arr=(m n)

大括号{}

①拓展。对大括号中的文件名做扩展。在大括号中,不允许有空白,除非这个空白被引用或转义。拓展分为普通以逗号(,)进行拓展,如echo {a,b}.txt将间隔的各项内容均列出;已两个点(..)进行拓展,如echo {1..5}.txt自动补全1到5中间内容。

[root@localhost ~]# echo {a,b}.txt
a.txt b.txt
[root@localhost ~]# echo {1..5}.txt
1.txt 2.txt 3.txt 4.txt 5.txt

②内部组 。与小括号中的命令不同,大括号内的命令在当前shell运行,不会重新开子shell。
括号内的命令间用分号隔开,最后一个命令后必须跟分号。{}的第一个命令和左括号之间必须要有一个空格。

双小括号 (( ))

for((...;...;...))
do
  cmd
done
while ((...))
do
  cmd
done

其他小知识点

ps|grep "${pname}" |grep -v "grep"|grep -v grep|awk '{print $1}' > "supertack.pid"
- 如果是2个pid,则此时文件supertack.pid中会保存为:
1234
1235
- 可以通过如下方式将2行内容输出到同一行,并以空格分隔开:
fpid=$(echo $(cat ${supertack_pid}))
echo $fpid  
输出为:1234 1235
然后在 kill -9 $fpid
tick_times="a_ticktack_times.log"
ticktimes=20
control_tick(){
    [ -s "${tick_times}" ] && { ticktimes=$(cat ${tick_times});}
    [ -z "${ticktimes}" ] &&  { echo "1">${tick_times};ticktimes=1;}
    debug_print "control_tick ticktimes=$ticktimes"
    if [ `expr $ticktimes % 20` == 0  ];then
        echo "1">${tick_times}
        return 8;
    else
        ticktimes=$(expr $ticktimes + 1);
        echo "${ticktimes}">${tick_times}
        return 7;
    fi
}
work(){
   control_tick
   is_tick=$?
   [ "${is_tick}" = 7 ] && {   echo  "TICK WAIT ,is_tick=fase[$is_tick]" && return 1 ; }
  do something;
}
f_jparse() {
    echo $1 | \
    sed -e 's/[{}]//g' | \
    sed -e 's/", "/","/g' | \
    sed -e 's/" ,"/","/g' | \
    sed -e 's/" , "/","/g' | \
    sed -e 's/","/'\"---RECORDSEPERATOR---\"'/g' | \
    awk -v RS='---RECORDSEPERATOR---' "\$1~/^\"$2\"/ {print}" | \
    sed -e "s/\"$2\"://"| sed 's/\"//g'|sed -e 's/\(^ *\)//' -e 's/\( *$\)//'
}
json={
  'type':1,
  'name':123
}
xurl=$(f_jparse "$json" 'type')
echo $xurl
输出:1

目前项目中只用到这些知识点,以后遇到在总结,😋

上一篇 下一篇

猜你喜欢

热点阅读