这篇质量不高
编写bash脚本程序有两种方式:
- 输入一系列命令让bash交互地执行它们,
- 把这些命令保存到一个文本文件中,然后将该文件作为一个程序来调用
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
网友评论