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. 局部变量提升为全局变量(不仅在当前)

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所在地址
在这里插入图片描述

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列数

你可能感兴趣的:(linux,linux,bash,Shell)