shell是一种解释行动语言,shell是通过大量的系统本身命令集合而成。
每个脚本在执行的时候要个一个可执行的权限
chmod u+x shellscript.sh
shell中每个命令的执行返回的结果中,如果正确执行返回0 否则将返回一个非零的状态,在命令执行语句之后加上echo $?可以打印退出状态
在shell变量中分为临时变量和永久变量
所谓永久变量就是不会随着你的环境的变换而改变变量的意义
例如:
#输出当前PATH路径
echo $PATH
临时变量只能在环境中有效
在自定义临时变量中,变量名必须是下滑线和字母开头(大小写均可)
定义变量(不能有空格):
Num=100
[root@localhost ~]# echo $Num
100
把命令返回的信息传递给变量
[root@localhost ~]# Time=$(date)
[root@localhost ~]# echo $Time
Fri Aug 16 14:04:38 EDT 2013
[root@localhost ~]# Time=$(date +%D)
[root@localhost ~]# echo $Time
08/16/13
变量之间的赋值:
形如 A=$B
[root@localhost shellscript]# echo $Time
08/16/13
[root@localhost shellscript]# Date=$Time
[root@localhost shellscript]# echo $Date
08/16/13
终端打印:
echo 和 printf
echo:
[root@localhost ~]# echo "Welcome to bash "
Welcome to bash
(1)不使用引号的echo时,不能在所要显示的文本中是使用分号(;),因为在分号在bash中被用作命令的定界符,所谓定界符就是命令的分割符
echo hello; hello被看作两个命令
echo hello 和 hello两个命令
(2)使用单引号echo时。
[root@localhost ~]# echo '$Time'
$Time
不在显示变量只显示单引号中的所有的字符
#!/bin/bash
printf "%-5s %-10s %-4s\n" No Name Mark
printf "%-5s %-10s %-4s\n" 1 A 10
printf "%-5s %-10s %-4s\n" 2 B 20
printf "%-5s %-10s %-4s\n" 3 C 30
[root@localhost shellscript]# sh ./printf.sh
No Name Mark
1 A 10
2 B 20
3 C 30
在 printf 中和在C语言中类似 -表示左对齐 如果不使用“-”将按照右对齐
%s %d %c %f 是格式符 \n是换行符
命令参数要在命令和字符串之间
echo:
-e 能够识别转义符信息
[root@localhost shellscript]# echo "1\t2\t3"
1\t2\t3
[root@localhost shellscript]# echo -e "1\t2\t3"
1 2 3
-n 忽略结尾
[root@localhost shellscript]# echo -n 'hello word'
hello word[root@localhost shellscript]#
在bash中每一个变量都是字符串。
环境变量是未在当前进程中定义,而从父进程
查看所有的环境变量:
[root@localhost shellscript]# set | more
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login
_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
....
删除环境变量:
unset命令主要是用来删除变量和函数
-f 删除函数
-v 删除变量
查看指定PID的环境变量:
cat /proc/$PID(进程ID号)/environ
[root@localhost shellscript]# cat /proc/1601/environ
TERM=linuxPATH=/sbin:/usr/sbin:/bin:/usr/binRUNLEVEL=5runlevel=5PWD=/LANGSH_SOURCED=1LANG=en_US.UTF-8PREVLEVEL=Nprevious=NCONSOLETYPE=vtSHLVL=2UPSTART_INSTANCE=UPSTART_EVENTS=runlevelUPSTART_JOB=rc_=/usr/sbin/vmware-vmblock-fuse[root@localhost shellscript]# cat /proc/1601/environ
.......
每个变量之间都是Null(\0)字符来分割
[root@localhost shellscript]# cat /proc/1601/environ | tr '\0' '\n'
TERM=linux
PATH=/sbin:/usr/sbin:/bin:/usr/bin
RUNLEVEL=5
runlevel=5
PWD=/
LANGSH_SOURCED=1
.........
tr : 是替换的命令
通过使用 tr,您可以非常容易地实现 sed 的许多最基本功能。您可以将 tr 看作为 sed 的(极其)简化的变体:它可以用一个字符来替换另一个字符,或者可以完全除去一些字符。您也可以用它来除去重复字符。这就是所有 tr 所能够做的。
tr用来从标准输入中通过替换或删除操作进行字符转换。tr主要用于删除文件中控制字符或进行字符转换。使用tr时要转换两个字符串:字符串1用于查询,字符串2用于处理各种转换。tr刚执行时,字符串1中的字符被映射到字符串2中的字符,然后转换操作开始。
带有最常用选项的tr命令格式为:
tr -c -d -s ["string1_to_translate_from"] ["string2_to_translate_to"] < input-file
这里:
-c 用字符串1中字符集的补集替换此字符集,要求字符集为ASCII。
-d 删除字符串1中所有输入字符。
-s 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。
input-file是转换文件名。虽然可以使用其他格式输入,但这种格式最常用。
2、字符范围
指定字符串1或字符串2的内容时,只能使用单字符或字符串范围或列表。
[a-z] a-z内的字符组成的字符串。
[A-Z] A-Z内的字符组成的字符串。
[0-9] 数字串。
\octal 一个三位的八进制数,对应有效的ASCII字符。
[O*n] 表示字符O重复出现指定次数n。因此[O*2]匹配OO的字符串。
tr中特定控制字符的不同表达方式
速记符含义八进制方式
\a Ctrl-G 铃声\007
\b Ctrl-H 退格符\010
\f Ctrl-L 走行换页\014
\n Ctrl-J 新行\012
\r Ctrl-M 回车\015
\t Ctrl-I tab键\011
\v Ctrl-X \030
[root@localhost shellscript]# cat abc.txt | tr "abc" "xyz" >new_abc.txt
[root@localhost shellscript]# cat new_abc.txt
xyz
x
xy
xz
xsgysz
[root@localhost shellscript]# cat abc.txt
abc
a
ab
ac
asgbsc
使用tr命令“统一”字母大小写
(小写 --> 大写)
# cat file | tr [a-z] [A-Z] > new_file
(大写 --> 小写)
# cat file | tr [A-Z] [a-z] > new_file
把文件中的数字0-9替换为a-j
# cat file | tr [0-9] [a-j] > new_file
删除文件file中出现的"Snail"字符
# cat file | tr -d "Snail" > new_file
删除“连续着的”重复字母,只保留第一个
# cat file | tr -s [a-zA-Z] > new_file
删除空行
# cat file | tr -s "\n" > new_file
删除Windows文件“造成”的'^M'字符
# cat file | tr -d "\r" > new_file
或者
# cat file | tr -s "\r" "\n" > new_file
【注意】这里-s后面是两个参数"\r"和"\n",用后者替换前者
用空格符\040替换制表符\011
# cat file | tr -s "\011" "\040" > new_file
把路径变量中的冒号":",替换成换行符"\n"
# echo $PATH | tr -s ":" "\n"