Shell编程(1)

这篇质量不高

编写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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,335评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,895评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,766评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,918评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,042评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,169评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,219评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,976评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,393评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,711评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,876评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,562评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,193评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,903评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,699评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,764评论 2 351

推荐阅读更多精彩内容