Shell(2):常用
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)判断指令是否存在
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、获取当前路径
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"
}' 路径
分类:
Linux与Shell
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性