2017文集我用 LinuxLinux

Shell编程(1)

2017-04-30  本文已影响39人  停下浮躁的心

这篇质量不高

编写bash脚本程序有两种方式:

  1. 输入一系列命令让bash交互地执行它们,
  2. 把这些命令保存到一个文本文件中,然后将该文件作为一个程序来调用

1. 输入一系列命令让bash交互地执行它们

在执行shell命令时多个命令可以在一个命令行上运行,但此时要使用分号(;)分隔命令

[space@space Desktop]$ pwd;ll;cat b.txt 
/home/space/Desktop
total 40
-rw-rw-r--. 1 space space    73 Apr 16 19:41 a.txt
-rw-rw-r--. 1 space space    80 Apr 16 19:42 b.txt
-rw-rw-r--. 1 space space    47 Apr 17 16:59 heiha
-rw-rw-r--. 1 space space     5 Apr 17 17:15 i
-rw-rw-r--. 1 space space     5 Apr 17 17:17 i.txt
-rw-rw-r--. 1 spc   spc   15033 Apr 11 11:57 j
-rw-rw-r--. 1 space space    35 Apr 17 17:27 re.txt
-rw-r--r--. 1 space space     0 Apr 24 16:23 shell.txt
hhhhhhhhhhhhh
kkkkkknnnnn
dddddddddddddddddd
jjjjjjjjj
mmmmmmmmmmm

lllllllllll
[space@space Desktop]$ 

长命令

[space@space Desktop]$ echo "this is \
> long command
> hahah "
this is long command
hahah 
[space@space Desktop]$ 

2. bash脚本

[space@space Desktop]$ vim shell-1
[space@space Desktop]$ cat shell-1
#!/bin/bash
# one example
df
free
pwd
echo "hahahahhaha"

pwd

echo "finish"

程序中第一行# !/bin/bash,它是注释语句的一种特殊形式,

!字符告诉系统同一行上紧跟在它后面的那个参数是用来执行本文件的程序。

在这个例子中,/bin/bash是默认的shell程序

[space@space Desktop]$ bash shell-1                    # 第一种方法
Filesystem                  1K-blocks    Used Available Use% Mounted on
/dev/mapper/centos_spc-root  18307072 3310148  14996924  19% /
devtmpfs                       918808       0    918808   0% /dev
tmpfs                          934328     156    934172   1% /dev/shm
tmpfs                          934328    9052    925276   1% /run
tmpfs                          934328       0    934328   0% /sys/fs/cgroup
/dev/sda1                      508588  160732    347856  32% /boot
tmpfs                          186868       4    186864   1% /run/user/42
tmpfs                          186868      40    186828   1% /run/user/1001
/dev/sr0                      7587292 7587292         0 100% /run/media/space/CentOS 7 x86_64
              total        used        free      shared  buff/cache   available
Mem:        1868660      800832      122100       11472      945728      808460
Swap:       2097148           0     2097148
/home/space/Desktop
hahahahhaha
/home/space/Desktop
finish

执行 [space@space Desktop]$ /bin/bash shell-1 一样的结果 这是因为把/bin 加入了环境变量(PATH)

[space@space Desktop]$ ls -ll shell-1 
-rw-rw-r--. 1 space space 77 Apr 24 16:32 shell-1
[space@space Desktop]$ chmod u+x shell-1       # 第二种方法 给文件加上可执行权限 就可以使用 ./执行
[space@space Desktop]$ ll -ll shell-1 
-rwxrw-r--. 1 space space 77 Apr 24 16:32 shell-1
[space@space Desktop]$ ./shell-1 
.......................

3. 在脚本中创建脚本,并在执行时写入,在脚本中执行脚本

[space@space Desktop]$ vim example1
[space@space Desktop]$ cat example1 
cd /home

ls

mkdir haha

cd haha

vi aa     # 再在shell脚本里面写一个脚本 没成功 出现 "aa" E212: Can't open file for writing Press ENTER or type command to continue

chmod +x aa

./aa

cd ..

pwd

echo "finish ..."
[space@space Desktop]$ chmod u+x example1 
[space@space Desktop]$ ./example1 
space  spc
mkdir: cannot create directory ‘haha’: Permission denied
./example1: line 7: cd: haha: No such file or directory

[1]+  Stopped                 ./example1         # 还是按ctrl+z结束了这个脚本    啊啊啊

改一下 把 ./aa 去掉
出现了这个

E325: ATTENTION Found a swap file by the name "/var/tmp/aa.swp"
owned by: space dated: Mon Apr 24 16:46:49 2017
file name: /home/aa
modified: YES
user name: space host name: space
process ID: 28693 (still running) While opening file "aa"

(1) Another program may be editing the same file. If this is the
case,
be careful not to end up with two different instances of the same
file when making changes. Quit, or continue with caution. (2) An edit session for this file crashed.
If this is the case, use ":recover" or "vim -r aa"
to recover the changes (see ":help recovery").
If you did this already, delete the swap file "/var/tmp/aa.swp"
to avoid this message. "aa" [New File] Press ENTER or type command to continue

按ENTER键 依旧出现上个错误

使用ps -aux 查看进程情况

space     28690  0.0  0.1 116156  2008 pts/0    T    16:43   0:00 bash
space     28693  0.0  0.1 128408  2016 pts/0    T    16:43   0:00 vi aa
root      28710  0.0  0.0      0     0 ?        S    16:45   0:00 [kworker/0:1]
root      28719  0.0  0.0      0     0 ?        S<   16:46   0:00 [kworker/0:2H]
root      28876  0.0  0.0      0     0 ?        S    16:50   0:00 [kworker/0:2]
space     28877  0.0  0.1 116156  1968 pts/0    T    16:50   0:00 bash
space     28880  0.0  0.1 128304  2040 pts/0    T    16:50   0:00 vi aa
root      28901  0.0  0.0      0     0 ?        S<   16:52   0:00 [kworker/0:0H]
root      28909  0.0  0.0 107892   624 ?        S    16:52   0:00 sleep 60
space     28913  0.0  0.1 116156  1940 pts/0    T    16:53   0:00 bash
space     28916  0.0  0.0 128304  1780 pts/0    T    16:53   0:00 vi aa
space     28923  0.0  0.0 141576  1684 pts/0    R+   16:53   0:00 ps -aux

好吧 有三个vi aa
全都kill 掉
使用 kill -s 9 进程ID 强制结束进程
然后出现了僵尸进程 <defunct>

space     28690  0.0  0.1 116156  2008 pts/0    T    16:43   0:00 bash
space     28693  0.0  0.0      0     0 pts/0    Z    16:43   0:00 [vi] <defunct>
root      28719  0.0  0.0      0     0 ?        S<   16:46   0:00 [kworker/0:2H]
root      28876  0.0  0.0      0     0 ?        S    16:50   0:00 [kworker/0:2]
space     28877  0.0  0.1 116156  1968 pts/0    T    16:50   0:00 bash
space     28880  0.0  0.0      0     0 pts/0    Z    16:50   0:00 [vi] <defunct>
root      28901  0.0  0.0      0     0 ?        S<   16:52   0:00 [kworker/0:0H]
space     28913  0.0  0.1 116156  1940 pts/0    T    16:53   0:00 bash
space     28916  0.0  0.0      0     0 pts/0    Z    16:53   0:00 [vi] <defunct>
root      28943  0.0  0.0      0     0 ?        S    16:55   0:00 [kworker/0:1]

网上这样说

有时候用kill -9 pid 任然无法杀死一个defunct进程。 此时我们可以使用命令 ps -xal 显示defunct进程的父进程,然后kill这个父进程就可以解决了。

然后我发现关掉终端就行了 关掉终端的时候 提示说 要关掉terminal 吗 关掉后悔kill正在运行的进程 好 这正是我想要的
再次打开 输入 ps -aux 发现那几个进程好像没有了
好吧
原来没有加 #!/bin/bash 承认错误 不过还是有收获的
不过问题依旧啊 还是出现

"aa" E212: Can't open file for writing Press ENTER or type command to continue

这个错误
然后
在 aa 中什么都不输入 :q退出

[space@space Desktop]$ ./example1 
space  spc
mkdir: cannot create directory ‘haha’: Permission denied
./example1: line 8: cd: haha: No such file or directory
chmod: cannot access ‘aa’: No such file or directory
/
finish ...

在unbuntu中没有问题

变量

shell变量可以分为两大类型:环境变量和用户定义变量。

自定义变量只能在当前shell环境中生效,
环境变量在整个主机的shell环境中生效

所有环境变量会传递给shell的子进程,这些变量大多数在/etc/profile文件中初始化,而/etc/profile是在用户登录的时候执行的
env只能查看环境变量,set查看所有的变量(包括用户自定义的变量)

命令替换

当一个命令被包含在一对括号里并在括号前加上$符号,如$(command),或者被包含在反引号(如command)中的时候,
shell把它替换为这个命令的输出结果。这个过程被称为命令替换

[space@space Desktop]$ haha=pwd
[space@space Desktop]$ echo "gggg is  $haha"
gggg is  pwd
[space@space Desktop]$ echo "gggg is  $(haha)"
bash: haha: command not found...
gggg is  
[space@space Desktop]$ echo "gggg is  $(pwd)"
gggg is  /home/space/Desktop
[space@space Desktop]$ haha=$(pwd)
[space@space Desktop]$ echo "gggg is  $haha"
gggg is  /home/space/Desktop
[space@space Desktop]$ echo "gggg is  $(haha)"
bash: haha: command not found...
gggg is  
设置变量
[space@space Desktop]$ stuname ="jjj"
bash: stuname: command not found...
[space@space Desktop]$ stuname="jjj"     #   = 两边不能有空格 严格要求
[space@space Desktop]$ echo $stuname
jjj
[space@space Desktop]$ unset stuname
[space@space Desktop]$ echo $stuname
                                     # 这里没有东西
[space@space Desktop]$ 
变量的声明

bash不一定要声明变量,但有些特殊类型的变量必须要声明。

命令语法:declare [options] [name[=value]]
typeset [options] [name[=value]]
功能:声明变量,初始化变量,设置他们的属性。当不使用name和options的时候,显示所有shell变量和他们的值。
常用选项:
-a 声明“name”是一个数组
-f 声明“name”是一个函数
-i 声明“name”是一个整数

-r     声明“name”是只读的变量
-x    表示每一个“name”变量都可以被子进程访问到,称为全局变量
[space@space Desktop]$ A='hello'
[space@space Desktop]$ echo "jjj is $A" # 这是双引号 变量可替换
jjj is hello
[space@space Desktop]$ x=$A
[space@space Desktop]$ echo $x
hello
[space@space Desktop]$ echo 'jjj is $A'  # 这是单引号 无视变量符$
jjj is $A
[space@space Desktop]$ echo "jjj is \$A"  # \在这里体现为使变量替换无效
jjj is $A
[space@space Desktop]$ echo 'jjj is \$A'
jjj is \$A
[space@space Desktop]$ echo \$x
$x
上一篇下一篇

猜你喜欢

热点阅读