Shell编程入门

前端之家收集整理的这篇文章主要介绍了Shell编程入门前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

1. Shell入门

  1. Shell 编程跟 java、PHP 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
  2. Linux 的 Shell 种类众多,本教程关注的是 Bash,也就是 Bourne Again Shell,由于易用和免费,Bash 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。
  3. Shell编程的实质就是将Shell命令添加到脚本文件中吧。并通过命令执行Shell命令。

开发步骤如下:

  1. 如下定义了hello.sh文件

    1. #!/bin/bash ##表示用哪一种解析器来解析执行我们的脚本程序
    2.  
    3. echo "Hello world"
  2. 执行脚本

    1. sh hello.sh
    2.  
    3. ##或者如下:凡是执行命令,系统都会先在Path环境变量里面找,如果找不到,再从下面的指定路径中找
    4.  
    5. ./hello.sh
  3. 如果不是管理员登录,可能对该文件没有执行权限,应该修改脚本执行权限

    1. chmod 755 hello.sh
    2. ./hello.sh

2. 变量定义

变量又称为系统变量和自定义变量。所谓的系统变量,则是在系统启动的时候就定义的了,系统变量可以通过set命令查找。如下:

  1. [hadoop@mini shell]$ set
  2. BASH=/bin/bash
  3. BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
  4. BASH_ALIASES=()
  5. BASH_ARGC=()
  6. BASH_ARGV=()
  7. BASH_CMDS=()
  8. BASH_LINENO=()
  9. BASH_SOURCE=()
  10. BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")
  11. BASH_VERSION='4.1.2(1)-release'
  12. COLORS=/etc/DIR_COLORS
  13. COLUMNS=112
  14. DIRSTACK=()
  15. EUID=500
  16. GROUPS=()
  17. G_BROKEN_FILENAMES=1
  18. HISTCONTROL=ignoredups
  19. HISTFILE=/home/hadoop/.bash_history
  20. HISTFILESIZE=1000
  21. HISTSIZE=1000
  22. HOME=/home/hadoop
  23. HOSTNAME=mini
  24. HOSTTYPE=x86_64
  25. IFS=$' \t\n'
  26. LANG=en_US.UTF-8
  27. LESSOPEN='||/usr/bin/lesspipe.sh %s'
  28. LINES=38
  29. LOGNAME=hadoop
  30. LS_COLORS= ... ##太多了 忽略掉。。。
  31. MACHTYPE=x86_64-redhat-linux-gnu
  32. MAIL=/var/spool/mail/hadoop
  33. MAILCHECK=60
  34. OLDPWD=/home/hadoop
  35. OPTERR=1
  36. OPTIND=1
  37. OSTYPE=linux-gnu
  38. PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/hadoop/bin
  39. PIPESTATUS=([0]="0")
  40. PPID=3893
  41. PS1='[\u@\h \W]\$ '
  42. PS2='> '
  43. PS4='+ '
  44. PWD=/home/hadoop/shell
  45. SELINUX_LEVEL_REQUESTED=
  46. SELINUX_ROLE_REQUESTED=
  47. SELINUX_USE_CURRENT_RANGE=
  48. SHELL=/bin/bash
  49. SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
  50. SHLVL=1
  51. SSH_CLIENT='192.168.254.1 54236 22'
  52. SSH_CONNECTION='192.168.254.1 54236 192.168.254.128 22'
  53. SSH_TTY=/dev/pts/0
  54. TERM=vt100
  55. UID=500
  56. USER=hadoop
  57. _=clear
  58. colors=/etc/DIR_COLORS

上面的代码中我们可以看到熟悉的变量,如BASH,PWD,USER 等等,接下来我们可以在客户端直接使用该命令:

  1. [hadoop@mini shell]$ set | grep PWD
  2. OLDPWD=/home/hadoop
  3. PWD=/home/hadoop/shell
  4. [hadoop@mini shell]$ cd ..
  5. [hadoop@mini ~]$ set | grep PWD
  6. OLDPWD=/home/hadoop/shell
  7. PWD=/home/hadoop

自定义变量的读写如下,这里需要注意的是,不同的ssh客户端下,自定义变量是无法共享的并且在声明变量的时候等号前后不能出现空格,值的使用最好加上双引号,这样可以防止值的内容出现空格造成不必要的麻烦

  1. [root@mini ~]# hero=luban
  2. [root@mini ~]# echo $hero
  3. luban
  4.  
  5. [root@mini ~]# str="hello world"
  6. [root@mini ~]# echo $str
  7. hello world
  8.  
  9. #当取变量的时候发现字符串连在一起:
  10. [root@mini ~]# people=aidisheng
  11. [root@mini ~]# echo "aidisheng's food"
  12. aidisheng's food [root@mini ~]# echo "${people}'s food" aidisheng's food #对于变量的删除 可以使用unset命令 [root@mini ~]# unset people [root@mini ~]# echo "${people}'s food" 's food
  13.  
  14. #普通的变量是允许修改的,而声明了readonly的变量是不允许修改
  15. [root@mini ~]# helloworld="hello world"
  16. [root@mini ~]# helloworld="hello world2"
  17. [root@mini ~]# unset helloworld
  18. [root@mini ~]# readonly helloworld="hello world"
  19. [root@mini ~]# helloworld="hello world2"
  20. -bash: helloworld: readonly variable

export: 可以将当前变量修改为本进程的变量,并允许子进程使用(不包括父进程),如下:

  1. [hadoop@mini shell]$ vi a.sh
  2. #!/bin/bash
  3. a=aaaaaa
  4. echo "a=$a"
  5. ./b.sh
  6.  
  7. [hadoop@mini shell]$ vi b.sh
  8. #!/bin/bash
  9. echo "b file--->a=$a"
  10.  
  11. [hadoop@mini shell]$ ./a.sh
  12. a=aaaaaa
  13. b file--->a=

source: 将当前某个sh文件放到当前进程中运行,也可以使用 . 来代替,如下代码,因为b.sh运行啊a.sh所在的进程里面,当然可以访问a变量的值:

  1. [hadoop@mini shell]$ vi a.sh
  2. #!/bin/bash
  3. a=aaaaaa
  4. echo "a=$a"
  5. source ./b.sh

3. 变量的操作

  1. 将一个命令的结果赋给某个变量

    1. [hadoop@mini shell]$ a=`ls -al`
    2. [hadoop@mini shell]$ echo $a
    3. total 20 drwxrwxr-x. 2 hadoop hadoop 4096 May 15 12:50 . drwx------. 3 hadoop hadoop 4096 May 15 11:45 .. -rwxrw-r--. 1 hadoop hadoop 47 May 15 12:50 a.sh -rwxrw-r--. 1 hadoop hadoop 34 May 15 12:37 b.sh -rwxr-xr--. 1 hadoop hadoop 31 May 15 11:46 hello.sh
    4. [hadoop@mini shell]$ b=`date +%Y-%m-%d`
    5. [hadoop@mini shell]$ echo $b
    6. 2018-05-15
  2. 特殊的命令:

    • $? 打印上一次命令的退出
    • $$ 打印当前进程号
    • $n 表示在调用sh文件的时候需要传递的参数,n代表第n个
    • $# 表示参数的个数
  3. 表达式:

    1. ##expr表达式的值操作前后需要加空格
    2.  
    3. [root@mini shell]# s=`expr 2 + 3`
    4. [root@mini shell]# echo $s
    5. 5
    6. [root@mini shell]# expr $s \* 4
    7. 20
    8.  
    9.  
    10. ##如果要进行多个表达式运算,需要多个expr命令
    11.  
    12. [root@mini shell]# expr `expr 2 + 3` \* 4
    13. 20

    上面的代码可以使用如下的形式:

    1. [root@mini shell]# a=$((1+2))
    2. [root@mini shell]# echo $a
    3. 3
    4. [root@mini shell]# echo $((1+2))
    5. 3
    6.  
    7. [root@mini shell]# b=$[3-2]
    8. [root@mini shell]# echo $b
    9. 1

4. 条件语句

if 条件语句:

shell
#!/bin/bash
read -p "Please input your name:" NAME
if [ $NAME = root ] ##注意这里预留的空格 如果条件是一个字符串,且不为空 都表示条件成立
then
echo "hello${NAME},welcome !"
elif [ $NAME = hadoop ]
then
echo "welcome to ${NAME}'s world !"
else
echo "Sorry,you have no permisson !"
fi

三元运算符:

​ [ condition ] && echo OK || echo notOK

​ 条件满足,执行&&后面的语句;条件不满足,执行||后面的语句。

对于双重条件的判断,可以使用 [[ ]] 来解决

shell
#!/bin/bash
loginname=zhangsan
pwd=123
if [[ $loginname = zhangsan && $pwd = 123 ]]
then
echo "you are right \!"
else
echo "you are wrong \!"
fi

字符串:

​ -z 表示字符串 长度为0 if [ -z “” ]

  1. -n 表示字符串长度不为0 **if [ -n "aa" ]**

整数比较:

​ -lt 小于

​ -le 小于等于

​ -eq 等于

​ -gt 大于

​ -ge 大于等于

​ -ne 不等于 if [ 1 -lt 3 ]

文件判断:

​ -d 是否是目录 if [ -d /bin ]

​ -f 是否为文件 if [ -f /bin/ls ]

​ -e 是否存在 if [ -e /bin/ls ]

while语句

  1. #!/bin/bash
  2. i=1
  3. while ((i<=3))
  4. do
  5. echo "current i:$i"
  6. let i++
  7. done

case语句

  1. #!/bin/bash
  2. str=china
  3. case $str in
  4. china)
  5. echo "hello china"
  6. ;;
  7. world)
  8. echo "hello world"
  9. ;;
  10. *)
  11. echo "Error \!"
  12. esac

for语句

  1. ##方式一
  2. #!/bin/bash
  3. str=china
  4. for N in 1 5 4 2
  5. do
  6. echo $N
  7. done
  8.  
  9. echo "--------------"
  10. ##方式二
  11. for ((i = 0;i <= 6;i++))
  12. do
  13. echo "curent i=$i"
  14. done

5. 函数的使用

  1. #!/bin/bash
  2. #func1.sh
  3. hello()
  4. {
  5. echo "hello world"
  6. return 2 ###return code is a status code,it's range is 0-255
  7. }
  8. echo "now going to the function hello"
  9. hello ##函数调用
  10. echo $? ##get the function return code
  11. echo "back from the function"

如果一个函数需要传递参数 可以在调用的时候在后面传递参数,在函数内部 可以使用

  1. $1 $2 $3 ${10}... ##超过10了要添加{}

同时,使用$#可以查看参数的个数。

如果想跨进程调用函数,应该这么写:

  1. [root@mini shell]# vi a.sh
  2. #!/bin/bash
  3. funadd()
  4. {
  5. echo "first arg is $1"
  6. echo "second arg is $2"
  7. echo "the sum is $(($1+$2))"
  8. }
  9. ##funadd 18 17
  10.  
  11. [root@mini shell]# vi b.sh
  12. #!/bin/bash
  13. echo "in b.sh file"
  14. source ./a.sh ##将a.sh代码合并到当前进程下。
  15. funadd 15 15 ##此刻就可以调用到a.sh下面的函数

猜你在找的Bash相关文章