Shell脚本学习指南

入门

  • awk和Bourne Shell,是POSIX Shell的基础
  • 除了POSIX标准,还有欧洲的X/Open标准
  • 正则表达式的两种类型
    • BRE Basic Regular Expressions 基本型 grep使用
    • ERE Extended Regular Expressions 扩展性 egrep使用
  • 小型Shell脚本的开发,首先,直接在命令行测试,然后将一系列命令放到脚本中,并设置可执行权限,最后使用脚本
$ cat > users       #建立文件,使用cat复制终端的输入
    who | wc -l     #程序的内容
    ^D              #Ctrl + D表示end-of-line
$ chmod +x nusers   #让文件拥有可执行权限
$ ./nusers          #执行
    6
$ cat nusers        #文件内容
    who | wc -l
  • Shell脚本第一行的”#!”
#! /bin/sh #告诉系统用哪种Shell解释
#! /bin/sh -f #-f表示执行脚本的参数,后面不能有空格,空格会跟着选项一起传给程序

   /bin/sh -f /bin/ls -la

#! /bin/awk -f #声明一个awk脚本,参数为-f
#! /bin/sh - #表示没有选项。这是基于安全的考虑,可避免欺诈攻击
  • Shell命令行参数
    • 不需要参数的选项,可以合并
    • 用分号分隔同一行里的多条命令
    • Shell基本命令
      • 内建命令
      • Shell函数
      • 外部命令——Shell会启动一个新进程执行外部命令,执行完后,回到Shell的进程继续执行
    • $加数字,表示脚本的参数
    • 如果参数超过9,则用大括号括起来 ${10}
ls -la
cd /usr/bin; ls -la
  • 变量
    • 已字母或下划线开头
    • 变量可以是空值,空值就是null
    • 变量赋值时,等号左右不能有空格
    • 获取变量的值,前面加$;如果值中含空格,需要用引号括起来
#! /bin/sh -
var1=1          #=>1
var2=aaa        #=>aaa
var3="bbb"      #=>bbb
var4="aaa bbb"  #=>aaa bbb
var5 =1         #=>错误
var6= 2         #=>错误
  • 输出
    • echo
      • 简单的输出,以换行符结束
      • -n选项,省略最后的换行符
      • echo命令标准不统一,所以可移植性有问题,只用此命令做最简单的输出,不要用复杂的参数
    • printf
      • 必须显示地指定换行符
#! /bin/sh -
echo "Hello World!"                 #=>Hello World!
printf "Hello World! i = [%d]\n" 3  #=>Hello World! i = [3]
  • IO重定向
    • > 重定向标准输出
    • < 重定向标准输入
    • >> 追加到文件
    • | 管道
    • /dev/null 读取/dev/null,会立即返回EOF
  • 基本命令查找
    • Shell在环境变量$PATH中查找要执行的命令
    • $PATH中,空项目用::表示,表示当前路径
    • 以:开头,表示先找当前路径
    • 以:结尾,表示最后找当前路径
    • 用.代替空项目,增强可读性
    • 不应该在查找路径中放进当前路径,因为会产生安全问题
  • 执行跟踪
    • 会打印Shell执行的语句
    • set -x 开始跟踪
    • st +x 取消跟踪
#! /bin/sh -
set -x
echo "111"
set +x
echo "222"

#输出:
+ echo 111
111
+ set +x
222
  • 国际化与本地化
    • internationalization i18n
    • localization l10n
    • Locale环境变量
      • LANG 未设置任何LC_XXX时的默认值
      • LC_ALL 用来覆盖所有其他的LC_XXX变量的值
      • LC_COLLATE 排序规则
      • LC_CTYPE 字符集
      • LC_MESSAGES 消息与响应(仅POSIX使用)
      • LC_MONETARY 货币
      • LC_NUMERIC 数字
      • LC_TIME 时间与日期
    • 应该避免为任何的LC_XXX变量赋值
    • locale -a
      • 列出所有locale名称
    • LC_ALL=da locale -ck LC_TIME
      • 查询丹麦文的时间日期格式
  • 涉及的命令
    • who命令
      • display who is logged in
    • tr
      • tr用来从标准输入中通过替换或删除操作进行字符转换
    • stty
    • locale
      • display locale settings
# 将文件file中出现的"abc"替换为"xyz"
cat file | tr "abc" "xyz" > new_file

# 使用tr命令“统一”字母大小写
cat file | tr [a-z] [A-Z] > new_file
cat file | tr [A-Z] [a-z] > new_file

# 把文件中的数字0-9替换为a-j
cat file | tr [0-9] [a-j] > new_file

# 删除文件file中出现的"Snail"字符
cat file | tr -d "Snail" > new_file
【注意】这里,凡是在file文件中出现的'S','n','a','i','l'字符都会被删除!而不是紧紧删除出现的"Snail”字符串

# 删除文件file中出现的换行'\n'、制表'\t'字符,不可见字符都得用转义字符来表示
cat file | tr -d "\n\t" > new_file

# 删除“连续着的”重复字母,只保留第一个
cat file | tr -s [a-zA-Z] > new_file

# 删除空行
cat file | tr -s "\n" > new_file

# 删除Windows文件“造成”的'^M'字符
cat file | tr -d "\r" > new_file
cat file | tr -s "\r" "\n" > new_file
【注意】这里-s后面是两个参数"\r""\n",用后者替换前者

# 用空格符\040替换制表符\011
cat file | tr -s "\011" "\040" > new_file

# 把路径变量中的冒号":",替换成换行符"\n"
echo $PATH | tr -s ":" "\n"

你可能感兴趣的:(Shell脚本学习指南)