翼度科技»论坛 云主机 LINUX 查看内容

shell简明教程1简洁的shell脚本

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
1简洁的shell脚本


1.1 Hello

脚本是包含一系列命令的命令行程序。 脚本中包含的命令由解释器执行。 在shell脚本中,shell充当解释器,一条接一条地执行脚本中列出的命令。
任何可以在命令行中执行的命令都可以放入shell脚本中。shell脚本是自动执行任务的好帮手。
让我们来看简单的shell脚本script1.sh:
  1. #!/bin/bash
  2. echo "Scripting is fun!"
复制代码
在尝试执行脚本之前,请确保它是可执行的
  1. $ chmod +x script-01.sh
  2. $ ./script-01.sh
  3. Scripting is fun!
复制代码
你会注意到,脚本的第一行以'#!'开头,后面是bash shell程序'/bin/bash'的路径。'#!'可以读成 "sharp bang"。 当脚本的第一行以'#!'可开头时,后面的内容将被用作脚本中所列命令的解释器。
1.2 变量

您可以在 shell 脚本中使用变量。变量就是有名称的存储位置。 你可以把变量看作是名称-值对。要为变量赋值,请使用语法VARIABLE_NAME="Value"。 等号前后不要使用空格。此外,变量是区分大小写的,按照惯例,变量名是大写的。要使用变量,请在变量名前加上美元符号。
  1. $ cat script-05.sh
  2. #!/bin/bash
  3. MY_SHELL="bash"
  4. echo "I like the $MY_SHELL shell."
  5. $ ./script-05.sh
  6. I like the bash shell.
复制代码
也可以用大括号括住变量名,并在大括号前加上美元符号。 语法 ${variable_name} .
  1. $ cat script-06.sh
  2. #!/bin/bash
  3. MY_SHELL="bash"
  4. echo "I like the ${MY_SHELL} shell."
  5. $ ./script-06.sh
  6. I like the bash shell.
复制代码
变量前面或后面非空格时通常建议加上大括号,否则会把整个字符串当成变量。
  1. $ ./script-07.sh
  2. I am bashing on my keyboard.
  3. $ cat script-08.sh
  4. #!/bin/bash
  5. MY_SHELL="bash"
  6. echo "I am $MY_SHELLing on my keyboard."
  7. $ ./script-08.sh
  8. I am  on my keyboard.
复制代码
您还可以将命令的输出赋值给变量, 用"$(命令)"即可,"$(命令)"用来替换原来的"hostname"
  1. $ cat script-09.sh
  2. #!/bin/bash
  3. SERVER_NAME=$(hostname)
  4. echo "You are running this script on ${SERVER_NAME}."
  5. $ ./script-09.sh
  6. You are running this script on andrew-HP.
  7. $ cat script-10.sh
  8. #!/bin/bash
  9. SERVER_NAME=`hostname`
  10. echo "You are running this script on ${SERVER_NAME}."
  11. $ ./script-10.sh
  12. You are running this script on andrew-HP.
复制代码
1.3 有效的变量名

变量名可以包含字母、数字和下划线。 变量名可以字母或下划线开头,但不能以数字开头。 以下是有效变量名的示例。
  1. # 有效的变量名
  2. FIRST3LETTERS="ABC"
  3. FIRST_THREE_LETTERS="ABC"
  4. firstThreeLetters="ABC"
  5. # 无效变量名
  6. 3LETTERS="ABC"
  7. first-three-letters="ABC"
  8. first@Three@Letters="ABC"
复制代码
1.4 测试

设计脚本的目的是为了取代人在键盘前输入一系列命令的工作。 如果您想自动执行一项任务,但需要根据不同的情况执行不同的操作,该怎么办?由于在需要运行脚本时,人可能不在身边,无法做出决定,因此我们需要对这些情况进行测试,并让脚本采取相应的行动。
要创建测试,请在括号中加入一个条件表达式。 语法如下 "[ 测试条件 ]" 。你可以测试几种情况。 例如,可以比较字符串是否相等、数字是否大于另一个数字或文件是否存在。 下面测试检查/etc/passwd是否存在。如果存在,则返回true。如果文件不存在,则返回false。 即命令以状态1退出。
  1. [ -e /etc/passwd ]
复制代码
如果使用的是bash shell,可以运行help test命令查看可以执行的各类测试。 也可以阅读test的man页面:man test 。 下面是一些比较常见的测试。

  • 文件操作符:

    • -d FILE 如果FILE是目录,则为真。
    • -e FILE 如果FILE存在,则为真。
    • -f FILE 如果FILE存在且是普通文件,则为真。
    • -r FILE 如果FILE可读取,则为True。
    • -s FILE-如果FILE存在且不是空文件,则为True。
    • -w FILE 如果FILE可写入,则为True。
    • -x FILE 如果FILE执行可,则为True。

  • 字符串操作符

    • -z STRING如果字符串为空,则为True。
    • -n STRING-如果字符串不为空,则为True。
    • STRING 字符串不为空时为True。
    • STRING1 = STRING2 如果字符串相等,则为True。
    • string1 != string2 如果字符串不相等,则为 rue。

  • 算术运算符

    • arg1 -eq arg2 如果arg1等于arg2,则为True。
    • arg1 -ne arg2 如果arg1不等于arg2,则为True。
    • arg1 -lt arg2 如果arg1小于arg2,则为True。
    • arg1 -le arg2 True如果arg1小于或等于arg2。
    • arg1 -gt arg2 True如果arg1大于arg2。
    • arg1 -ge arg2 如果arg1大于或等于arg2,则为True。

1.5 if语句

既然知道了如何判断某个条件是否为真,就可以结合if语句在脚本中做出判断。
if语句以"if"开头,然后是一个测试。下面一行包含then. 接下来是一系列命令,如果测试条件为真,这些命令将被执行。最后,if语句以 fi结尾。 语法如下
  1. if [ condition-true ]
  2. then
  3.    command 1
  4.    command 2
  5.    ...
  6. fi
复制代码
下面是一个例子
  1. $ cat script-11.sh
  2. #!/bin/bash
  3. MY_SHELL="bash"
  4. if [ "$MY_SHELL" = "bash" ]
  5. then
  6.   echo "You seem to like the bash shell."
  7. fi
  8. $ ./script-11.sh
  9. You seem to like the bash shell.
复制代码
在进行条件测试时,最好用引号将变量括起来,以防止一些意想不到的结果。
使用if/else语句还可以在条件不为真时执行操作。 下面是if/else语句的例子。
  1. if [ condition-true ]
  2. then
  3.    command 1
  4.     command 2
  5.    ...
  6. else  #
  7.    command 3
  8.    command 4
  9.    ...
  10. fi
复制代码
修改代码走else:
  1. #!/bin/bash
  2. MY_SHELL="csh"
  3. if [ "$MY_SHELL" = "bash" ]
  4. then
  5.   echo "You seem to like the bash shell."
  6. else
  7.   echo "You don't seem to like the bash shell."
  8. fi
  9. $ ./script-12.sh
  10. You don't seem to like the bash shell.
复制代码
还可以使用elif来测试多个条件。elif是"else if"的缩写。 和if一样,在elif后面加上要测试的条件。 在下一行,使用 then.  最后,如果条件为真,则执行一系列命令。
  1. if [ condition-true ]
  2. then
  3.    command 1
  4.    command 2
  5.    ...
  6. elif [ condition-true ]
  7. then
  8.    command 3
  9.    command 4
  10.    ...
  11. else  #
  12.    command 5
  13.     command 6
  14.    ...
  15. fi
复制代码
走elif的示例:
  1. #!/bin/bash
  2. MY_SHELL="csh"
  3. if [ "$MY_SHELL" = "bash" ]
  4. then
  5.   echo "You seem to like the bash shell."
  6. elif [ "$MY_SHELL" = "csh" ]
  7. then
  8.   echo "You seem to like the csh shell."
  9. else
  10.   echo "You don't seem to like the bash or csh shells."
  11. fi
  12. $ ./script-13.sh
  13. You seem to like the csh shell.
复制代码
参考资料

1.6 FOR循环

如果要对列表执行操作,可以使用for循环。for循环的第一行以"for"开头,然后是变量名,接着是 "in",然后是项目列表。 下一行包含单词"do"。将要执行的语句放在下面几行,最后以单行 "done"结束 for 循环。
  1. for VARIABLE_NAME in ITEM_1 ITEM_2 ITEM_N
  2. do
  3.   command 1
  4.   command 2
  5.   ...
  6. done
复制代码
列表中的第一项被赋值给变量,代码块被执行。然后将列表中的下一项分配给变量,并执行命令。
  1. $ cat script-14.sh
  2. #!/bin/bash
  3. for COLOR in red green blue
  4. do
  5.   echo "COLOR: $COLOR"
  6. done
  7. $ ./script-14.sh
  8. COLOR: red
  9. COLOR: green
  10. COLOR: blue
复制代码
这个名为rename-pics.sh的shell脚本会重命名所有以jpg结尾的文件,在原文件名前加上今天的日期。
  1. #!/bin/bash
  2. PICTURES=$(ls *jpg)
  3. DATE=$(date +%F)
  4. for PICTURE in $PICTURES
  5. do
  6.   echo "Renaming ${PICTURE} to ${DATE}-${PICTURE}"
  7.   mv ${PICTURE} ${DATE}-${PICTURE}
  8. done
复制代码
下面是运行此脚本后的结果。
  1. $ ls
  2. bear.jpg  man.jpg  pig.jpg  rename-pics.sh
  3. $ ./rename-pics.sh
  4. Renaming bear.jpg to 2023-08-03-bear.jpg
  5. Renaming man.jpg to 2023-08-03-man.jpg
  6. Renaming pig.jpg to 2023-08-03-pig.jpg
  7. $ ls
  8. 2023-08-03-bear.jpg  2023-08-03-man.jpg  2023-08-03-pig.jpg  rename-pics.sh
  9. $
复制代码
1.7 位置参数

位置参数是包含命令行内容的变量。脚本本身存储在$0,第一个参数存储在$1,第二个参数存储在$2,以此类推。 以下面的命令行为例
  1. $ script.sh parameter1 parameter2 parameter3
复制代码
内容如下: $0为"script.sh",$1为 "parameter1",$2为 "parameter2",$3为 "parameter3"。
这个名为archive_user.sh的脚本接受一个用户名参数。
  1. #!/bin/bash
  2. echo "Executing script: $0"
  3. echo "Archiving user: $1"
  4. # Lock the account
  5. passwd -l $1
  6. # Create an archive of the home directory.
  7. tar cf /archives/${1}.tar.gz /home/${1}
复制代码
特殊变量$@,可以访问命令行上从$1开始到最后一个的所有位置参数。 以下是如何更新 archive_user.sh 脚本以接受一个或多个参数。
  1. #!/bin/bash
  2. echo "Executing script: $0"
  3. for USER in $@
  4. do
  5.   echo "Archiving user: $USER"
  6.   # Lock the account
  7.   passwd -l $USER
  8.   # Create an archive of the home directory.
  9.   tar cf /archives/${USER}.tar.gz /home/${USER}
  10. done
复制代码
让我们向脚本传递多个用户。
  1. $ ./archive_user.sh chet joe
  2. Executing script: ./archive_user.sh
  3. Archiving user: chet
  4. passwd: password expiry information changed.
  5. tar: Removing leading `/' from member names
  6. Archiving user: joe
  7. passwd: password expiry information changed.
  8. tar: Removing leading `/' from member names
复制代码
1.8 获取用户输入

如果要接受标准输入,请使用read命令。标准输入通常来自键盘输入,但也可能来自其他来源,如命令管道中命令的输出。read命令的格式是read -p "PROMPT" VARIABLE_NAME 。 此版本的 archive_user.sh脚本会询问用户账户。
  1. #!/bin/bash
  2. read -p "Enter a user name: " USER
  3. echo "Archiving user: $USER"
  4. # Lock the account
  5. passwd -l $USER
  6. # Create an archive of the home directory.
  7. tar cf /archives/${USER}.tar.gz /home/${USER}
复制代码
让我们运行此脚本,将mitch账户存档。
  1. ./archive_user.sh
  2. Enter a user name: mitch
  3. Archiving user: mitch
  4. passwd: password expiry information changed.
  5. tar: Removing leading `/' from member names
  6. $
复制代码


来源:https://www.cnblogs.com/testing-/p/17601496.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具