shell

https://blog.csdn.net/u012421852/article/details/51813411

https://www.cnblogs.com/wjoyxt/p/4815782.html

https://www.jianshu.com/p/2237f029c385

 

#!/bin/bash
[ ! -d /opt/tts ] && mkdir -p /opt/tts

 

$()和${}

1、在 bash shell 中,$()是将括号内命令的执行结果赋值给变量:

2、${} 是用来作变量替换。一般情况下,$var 与 ${var} 并没有啥不一样。但是用 ${ } 会比较精确的界定变量名称的范围:

 

$[] 和 $(())

它们是一样的,都是进行数学运算的。支持+ - * / %:分别为 “加、减、乘、除、取模”。但是注意,bash只能作整数运算,对于浮点数是当作字符串处理的

 

3、${ } 的一些特殊功能:

假设我们定义了一个变量为:file=/dir1/dir2/dir3/my.file.txt

${file#*/}:拿掉第一条 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:拿掉最后一条 / 及其左边的字符串:my.file.txt
${file%/*}:拿掉最后条 / 及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:拿掉第一条 / 及其右边的字符串:(空值)

记忆的方法为:
# 是去掉左边(在鉴盘上 # 在 $ 之左边)
% 是去掉右边(在鉴盘上 % 在 $ 之右边)
单一符号是最小匹配﹔两个符号是最大匹配。
${file#/}(不加*号)表示只去掉最左边的/

 

 

常用的命令展示


  chatter: 锁定文件,不能删除,不能更改
        +a:  只能给文件添加内容,但是删除不了,
              chattr +a  /etc/passwd
        -d:      不可删除
        加锁:chattr +i  /etc/passwd       文件不能删除,不能更改,不能移动
        查看加锁: lsattr /etc/passwd      文件加了一个参数 i 表示锁定
        解锁:chattr -i /home/omd/h.txt    - 表示解除
        隐藏chattr命令:

1
2
3
4
5
which chattr
mv /usr/bin/chattr  /opt/ftl/
cd /opt/ftl/ 
mv chattr h    -->更改命令,使用别名h隐藏身份
/opt/ftl/h +i /home/omd/h.txt   -->利用h 行驶chattr命令
1
lsattr /home/omd/h.txt    -->查看加密信息

恢复隐藏命令

1
2
3
mv h /usr/bin/chattr
chattr -i /home/omd/h.txt
lsattr /home/omd/h.txt
 
#!/bin/sh
if [ "$1" ];then
        IDC_CODE=$1
fi
Red_Error(){ echo '================================================='; printf '\033[1;31;40m%b\033[0m\n' "$1"; exit 0; } is64bit=$(getconf LONG_BIT) if [ "${is64bit}" != '64' ];then Red_Error "抱歉, 7.x不支持32位系统, 请使用64位系统或安装宝塔5.9!"; fi
isPy26=$(python -V 2>&1|grep '2.6.')
if [ "${isPy26}" ];then
        Red_Error "抱歉, 7.x不支持Centos6.x,请安装Centos7或安装宝塔5.9";
fi

 

0表示标准输入
1表示标准输出
2表示标准错误输出
> 默认为标准输出重定向,与 1> 相同
2>&1 标准错误输出 重定向到 标准输出.
&>file 标准输出 和 标准错误输出 都重定向到文件file中

在使用通道的时候,如$ ls | grep "a.out",中的"|"管道符,是由系统完成了ls的输出 作为grep的输入,由于|接收的是来自标准输出流作为自己的输入,所以ls的输出是标准输出(1)。 从这可以知道,如果在shell命令终端要将一个COMMOND的输出作为|的输入,就需要分类情况,如下所示:

情况1:如果COMMOND的输出为标准输出(1),则可以如下使用通道"|"
$COMMOND | grep "a.out"

情况2:如果COMMOND的输出为标准错误输出(2),则可以如下使用通道"|"
$COMMOND 2>&1 | grep "a.out"

如上所示:先将 COMMOND的标准错误输出(2)重定向到标准输出(1),然后就可以使用通道"|"了

现在问题来了,对于给出的一个shell命令,我们有的不知道其输出是标准错误输出还是标准输出,所以有没有方法来确定此shell命令的输出是2还是1呢?,答案:可以使用strace跟踪此shell命令的write调用就可以了,如果write的第一个参数是1则此shell命令的输出就是标准输出,如果write的第一个参数是2则此shell命令的输出就是错误输出。

2. 请用strace确定ls的输出是标准输出(1)

$strace -e trace=write ls

 

getconf

我们时常需要查询系统相关的信息,比如页面大小,整数大小之类,如果编写程序去计算会比较繁琐,这里有一个很有用的命令,可以用来获取系统相关信息。它就是getconf。

getconf 用途将系统配置变量值写入标准输出,比如:

  getconf PAGE_SIZE 查看系统内存分页大小

  getconf LONG_BIT 看linux是32位还是64位最简单的方法

  getconf -a 查看全部系统变量

 

 

 

$ getconf PAGE_SIZE

4096

$ getconf INT_MAX

2147483647

$ getconf LONG_BIT

64

 

7.原样输出字符串,不进行转义或取变量(用单引号)

echo '$name\"'

输出结果:

$name\"

8.显示命令执行结果

echo `date`

printf

#!/bin/bash
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg  
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543 
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876

执行脚本,输出结果如下所示:

姓名     性别   体重kg
郭靖           66.12
杨过           48.65
郭芙           47.99


%s %c %d %f都是格式替代符

%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。

%-4.2f 指格式化为小数,其中.2指保留2位小数。

 

更多实例:

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com
 
# format-string为双引号
printf "%d %s\n" 1 "abc"

# 单引号与双引号效果一样 
printf '%d %s\n' 1 "abc" 

# 没有引号也可以输出
printf %s abcdef

# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
printf %s abc def

printf "%s\n" abc def

printf "%s %s %s\n" a b c d e f g h i j

# 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
printf "%s and %d \n"

执行脚本,输出结果如下所示:

1 abc
1 abc
abcdefabcdefabc
def
a b c
d e f
g h i
j  
 and 0

数值测试

参数说明
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真

实例演示:

num1=100
num2=100
if test $[num1] -eq $[num2]
then
    echo '两个数相等!'
else
    echo '两个数不相等!'
fi

输出结果:

两个数相等!

代码中的 [] 执行基本的算数运算,如:

#!/bin/bash

a=5
b=6

result=$[a+b] # 注意等号两边不能有空格
echo "result 为: $result"

结果为:

result 为: 11

字符串测试

参数说明
= 等于则为真
!= 不相等则为真
-z 字符串 字符串的长度为零则为真
-n 字符串 字符串的长度不为零则为真

实例演示:

num1="ru1noob"
num2="runoob"
if test $num1 = $num2
then
    echo '两个字符串相等!'
else
    echo '两个字符串不相等!'
fi

输出结果:

两个字符串不相等!

文件测试

参数说明
-e 文件名 如果文件存在则为真
-r 文件名 如果文件存在且可读则为真
-w 文件名 如果文件存在且可写则为真
-x 文件名 如果文件存在且可执行则为真
-s 文件名 如果文件存在且至少有一个字符则为真
-d 文件名 如果文件存在且为目录则为真
-f 文件名 如果文件存在且为普通文件则为真
-c 文件名 如果文件存在且为字符型特殊文件则为真
-b 文件名 如果文件存在且为块特殊文件则为真

实例演示:

cd /bin
if test -e ./bash
then
    echo '文件已存在!'
else
    echo '文件不存在!'
fi

输出结果:

文件已存在!

另外,Shell还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为:"!"最高,"-a"次之,"-o"最低。例如:

cd /bin
if test -e ./notFile -o -e ./bash
then
    echo '至少有一个文件存在!'
else
    echo '两个文件都不存在'
fi

输出结果:

至少有一个文件存在!

 



 
posted @ 2020-04-15 16:09  linuxws  阅读(239)  评论(0编辑  收藏  举报