linux|Linux Shell编程


文章目录

    • 1. 脚本默认格式
    • 2. 运行脚本
    • 3. 局部变量提升为全局变量(不仅在当前)
    • 4. 特殊参数
    • 5. 数值运算
    • 6. 命令替换(将运算的结果赋值给另外的参数)
    • 7. 条件判断
    • 9. case
    • 10. for循环
    • 11. for in循环
    • 12. while循环
    • 13. 读取控制台输入
    • 14. 函数
    • 15. crontab 定时任务处理
    • 16. cut \awk文件内容处理

1. 脚本默认格式
#!/bin/bash ...

2. 运行脚本
chmod +x filename,./filename bash +filename|sh +filename --------以下命令不会开辟子shell,若对环境变量有改变,会直接影响当前shell------- source +filename . +filename

3. 局部变量提升为全局变量(不仅在当前) 【linux|Linux Shell编程】export var_name
在父shell中声明的全局变量可以被子shell查看,而子shell中对全局变量的修改只能由其子shell所见(父shell不可见)。
4. 特殊参数 $0 脚本名称
$1~$9:第1个参数至第9个参数
$#:当前输入参数的个数
? 将 参 数 当 做 字 符 串 , * 将参数当做字符串, ?将参数当做字符串,@将参数当成数组
$? 获取最后一次脚本执行结果(0成功,127未找到命令)
? 与 *与 ?与?需要被“”包围不然没有区别
5. 数值运算 $[3*2]
6. 命令替换(将运算的结果赋值给另外的参数) a=$(expr 5 *2)
a=`expr 5 *2`
7. 条件判断 字符串比较 [ $a=apple ] 若执行成功返回0,失败返回1
数字比较 [ 2 -et 3 ] [ 2 -lt 3 ] [ 2 -lt 3 ]
判断是否有权限 [ -r filename ] [ -w filename ] [ -x… ]
文件类型判断 是否存在:-e 存在且是普通文件:-f 是目录:-d
if [ condition ] then ... elif [ condition ] then ... else ... fi

字符串判断技巧(防止输入的字符串为空,拼接一个x)
if [ "$1"x="target"x]; then …
9. case
case $1 in "result1") ... ; ; "result2") ... ; ; "*") ... ; ; esac

10. for循环
for (( i=0; i<10; i++ )) do ... done

11. for in循环
for i in {1..100}#1~100的序列 do ... done

12. while循环
while [ condition ] do let a+=1#let a+=1 等价于 a=$[$a+1] done

13. 读取控制台输入 read -t 7 -p “Enter your name in 7 seconds:” Name
echo $name
14. 函数
  • basename [filepath] [suffix]: 得到filepath的最终文件名,并去除suffix后缀
basename /etc/file.sh .sh file 脚本中调用: $(basename $1 .sh)

  • dirname [filepath] :获取相对路径
#获取绝对路径 cd $(dirname $0) pwd

  • 自定义函数:
[function] funcname [()] { action; [return int; ]#只能返回数字(0-255)由$?获取 } 举例: function add(){ echo $[$1+$2] } add 1 2 #调用 sum=$(add 1 2) #用命令替换配合echo可以完成255以上的返回值

15. crontab 定时任务处理 crontab -l 查询定时任务
crontab -e 设立定时任务
16. cut \awk文件内容处理
cut -d " " -f 1 aa.txt#从aa.txt中以' '为分隔符提取第一列 cut -d " " -f 2,3 aa.txt #提起第2,3列 #awk -v 可以引入自定义变量 awk -F " " -v i=1 '/Pattern/{action}' 以' '分割,以Pattern正则表达式进行匹配之后,做action操作。

例如要提取以下的用户名.家目录.bash所在地址
linux|Linux Shell编程
文章图片

cat /etc/passwd | grep bash | cut -d ":" -f 1,6,7 #awk实现(awk可以同时分割行与列,cut只能分割列) #结果以,进行分割 cut做不到 cat /etc/passwd | awk -F ":" '/bash$/{print $1 "," $6 "," $7}' #在之前打印a,最后打印b cat /etc/passwd | awk -F ":" 'BEGIN{print a} {print $1$6$7} END{print b}'

awk内置变量: FILENAME文件名 NR行号 NF列数

    推荐阅读