Shell(2):常用

总结自:Shell基础 - ShineLe - 博客园

1、echo输出(到屏幕、到文件)

复制代码
#输出变量
echo ${name} echo $name #带双引号的用于字符串拼接会比较方便 echo "$name" echo "${name}" 

#不换行输出
echo -n 内容

#输出到文件
echo "abc" >> "test.txt"

#输出多行,用单引号
echo 'aaa
bbb
ccc'

#以指定格式输出date
current_time=$(date +"%Y-%m-%d %H:%M:%S")
echo "Current time : $current_time"
复制代码

 带双引号输出的作用:安全,如果输出的内容中包含空格,使用双引号会正确识别空格并完整输出。

有一个奇怪的事情,在Shell脚本中,如果要将某个多行且包含空格的内容,输出到某个文件,那么只能用单引号,而双引号会在空格处中断,只输出空格前的部分

2、if条件

1)用户判断

如果用户名为user1,则执行某个命令,否则不执行

#!/bin/bash
userName=`whoami`#用反引号的方式执行系统命令whoami
if [ $userName = "user1" ];then
    echo "path is $(realpath $0) "
    exit
fi

注意字符串相等与否比较用=而非==,后者只能用于数字或纯数字字符串

2)检测文件/目录
复制代码
#文件是否存在
FILE=/etc/resolv.conf
#1
if test -f "$FILE";then
    echo "$FILE exist"
fi

#2
if [ -f "$FILE" ];then
    echo "$FILE exist"
fi

#3 是否不存在
if [ ! -f "$FILE" ];then
    echo "$FILE does not exist"
fi

#4 是否存在多个文件 -a或者&&
if [ ! -f "$FILE1" -a -f "$FILE2" ];then
    echo "both files exist"
fi

if [ ! -f "$FILE" && -f "$FILE"];then
    echo "both files exist"
fi
复制代码
#目录是否存在
DIR=/etc/docker
if[ -d "$FILE" ];then
    echo "$FILE is a directory"
fi

3)判断指令是否存在

具体说明:Linux:如何在脚本中判断某个指令是否存在

result=`which aaa`
if[ ${#result}==0 ];then
    echo 0
fi

4)字符串判断(为空、长度为0,相等)

如果要取反,就在相应表达式前加!

复制代码
#!/bin/bash

str=""
#为空,无标识符
if [ str ];then
        echo ""
fi

#串长,-z和-n
if [ -z $str ];then
        echo "字符串长0"
fi
str2="abc" if [ -n $str2 ];then echo "字符串长不为0" fi

#相等=和!= str3="bc" str4="abc" if [ str=str3 ] then echo "str和str3相同" else echo "str和str3不相同" fi if [ str=str4 ] then echo "str和str4相同" else echo "str和str4不相同" fi
复制代码

4.2 for循环

第二种写法还可以用于文件名中,相当于内嵌的for循环,代表多个文件(mkdir test{1..4}

复制代码
三种写法
for 变量 in 值1 值2 值3 ...
    do
        程序
    done

for 变量 in { 起始值1..终值n } #类似python for i in range(1,100)
  do
    程序
  done

for (( 初始值;循环控制条件;变化 )) #类似Java for(int i=0;i<100;i++)
    do
        程序
    done
复制代码

打印1-4的三种写法

复制代码
for i in 1 2 3 4
    do
        echo $i
    done

for i in {1..4}
    do
        echo $i
    done

for (( i=1;i<=4;i++ ))
    do
        echo $i
    done
复制代码

用for循环读取文件中的值

学习自:bash如何使用for循环按行读入文本文件 - 简书

空格为分隔符

for i in $`cat t.txt` 或 for i in $(cat t.txt)
    do
        echo $i
    done

换行符为空格符

IFS=$'\n'
for i in $''`cat t.txt`
    do
        echo $i
    done

 如果文件为空,那么循环会立刻退出,循环体一次也不会执行

 

6、获取当前路径

Shell脚本获取当前路径_笔记大全_设计学院

7、字符串(见Shell:字符串 - ShineLe - 博客园

8、在root下切换为某个用户再执行指令,而非以root执行

不要写为

su - 用户名 
各种shell指令

这时各种shell指令的执行者仍然是root

正确写法①

su - 用户名 << EOF
以用户身份执行各种指令
EOF

 ②

su - 用户名 -c "命令" #命令要用引号括起来

9、变量、字符串拼接

直接用空格就行,在输出时会自动把它们没有间隙地拼在一块:

val1="abc"
val2="def"
print val1 "_" val2
#abc_def

10、awk指定列分隔符:-F '分隔符'

指定输出记录的分割符:-v ORS="分隔符"

常规用法

awk -F':' -v ORS="," '{$1=$1;PRINT $0}' /etc/passwd

有了ORS就不用再每段print最后人为加换行符/分隔符

awk -F ':' -v ORS=',' '{
print "1"
print "2"
print "3"
print "4"
}' 

1,2,3,4,

11、awk对行进行循环处理

不用写循环语句,因为awk默认的处理方式就是按行进行的

awk -F':' '{name=$1}'

12、输出单双引号

# 输出双引号
awk -F "" '{print "\""}'     "xxxxx",
使用""双引号把一个双引号括起来,然后用转义字符\对双引号进行转义,输出双引号。
 
# 输出单引号
awk -F "" '{print "\'"}'    'xxxxx',
# 使用一个双引号"",然后在双引号里面加入两个单引号'',
# 接着在两个单引号里面加入一个转义的单引号\',输出单引号

 

生成一个标准格式(所有变量之间用空格进行分隔,但在输出时却不会有空格)

sig = "\""
print sig "can_login" sig ":" canlogin
# "can_login":true

13、awk读取某行、某列、某行某列

指定某列时有时需要指定分隔符

复制代码
1、指定分隔符
awk -F':' '动作' 文件名

2、输出第1列
awk -F':' 'print $1' 文件名

3、输出第2行
awk -F':' 'NR==2 {print}' 文件名

4、输出第2行第3列
awk -F':' 'NR==2 {print $3}' 文件名
复制代码

把逻辑运算计算得到的1、0输出为true和false

awk '{

if(A==1)print "true"
else print "false"

}' 路径

 

 

posted @   ShineLe  阅读(54)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示