shell脚本入门
001
#!/bin/bash
002
fruit=apple
003
count=5
004
echo "We have $count ${fruit}(s)"
005
006
007
#shell 变量的使用
008
#shell 环境变量
009
echo $PATH
010
011
012
#添加一条新路径
013
export PATH="$PATH:/home/usr/bin"echo $PATH
014
015
016
#获取字符串长度
017
var=123456echo ${#var}
018
019
020
#获取当前shell版本
021
echo $SHELL
022
echo $0
023
024
025
#检查当前用户是否超级用户
026
if [ $UID -ne 0 ]; then
027
echo no root user please run as root
028
else echo 'Root user's
029
030
031
#运算 let no1++, let no1=- let no+=6 let no-=6
032
no1=4
033
no2=5
034
let result=no1+no2
035
echo $result
036
037
038
#重定向文件 > 每次都会覆盖文件
039
echo "this is a sample 1" > temp.txt
040
#重定向 >> 追加文件
041
# 0 - 标准输入
042
#1 - 标准输出
043
# 2 - 标准错误
044
echo "this is a sample 2" >> temp.txtecho ls > dd.txt 2>&1
045
#错误信息和标准信息全部重定向到dd.txt中
046
047
048
#定义和使用数组
049
arr=(1 2 3 4)
050
echo ${arr[0]}
051
052
053
#另一种 生命方式
054
arr[0]="test1"
055
arr[1]="test2"
056
echo ${arr[0]}
057
index=5echo ${arr[$index]}
058
059
#关联数组
060
#关联数组需要单独声明 declare -a arr
061
062
arr[0]=wangdk;
063
arr[apple]=iphone5
064
065
也可以用
066
arr=([0]=wangdk [1]=test)
067
068
# 列出数组索引
069
echo ${$arr[*]}
070
echo ${!arrw[@]}
071
072
#命令别名
073
alias new_command='command"
074
# 别名临时生效
075
alias install='yum -y install'
076
# 永久生效
077
echo 'alias cmd="command" >> ~/.bashrc
078
079
#屏蔽终端输入
080
echo -e "Enter password:"
081
stty -echo #屏蔽输出
082
read password
083
stty echo #打开输出
084
echo
085
echo Password read.
086
087
088
#时间相关命令脚本
089
date #时间
090
date +%s 时间戳
091
date --date "2012-10-20 12:00:00" +%s 日期转时间戳
092
date --date "@1370059200" +%D 时间戳转日期
093
date --date "@1370059200" "+%Y/%m/%d %H:%M:%S"
094
095
#检查一组命令所需要的时间
096
#!/bin/bash
097
start=$(date +%s)
098
commands
099
end=$(date +%s)
100
difference = $((end - start))
101
102
103
#sleep 计算时间循环
104
105
#输出一个Count
106
echo -n Count
107
# 存储光标位置
108
109
tput sc
110
111
#初始化变量
112
count=0
113
while true
114
do
115
# 如果<40
116
if [ $count -lt 40 ];
117
# 自增
118
then let count++;
119
sleep 1;
120
121
#恢复光标
122
tput rc
123
tout ed
124
# 输出
125
echo -n $count;
126
else exit 0;
127
fi
128
done
129
130
#shell 函数定义 传参
131
#/bin/bash
132
#filename function
133
function fname()
134
{
135
echo $1, $2; #打印参数1, 参数2
136
echo "$@"; #以列表的方式一次性打印打印
137
echo "$*"; #类似于$@ 但是参数被作为单位打印
138
return 0; #返回值
139
}
140
fname wangdk, sunshuzhen; #调用函数
141
echo $? #最近函数返回值
142
143
#预读命令
144
cmd_output=$(ls | cat -n)
145
echo $cmd_output
146
147
#另一种反引用
148
cmd_output=` ls } cat -n`
149
echo $cmd_output
150
151
#通过引用子shell的方式保留空格和换行符
152
cat text.txt #输出过滤空格
153
154
out="$(cat text.txt)"
155
echo $out #保持原样
156
157
#rand 命令 读取命令行字符
158
159
read -n 2 var # 读取2个字符到 var 变量
160
echo $var
161
162
read -s var # 用不回显示读取密码
163
echo $var
164
165
read -p "Enter input :" var
166
echo $var;
167
168
read -t 2 var #在2秒内读取变量
169
echo $var
170
171
read -d ":" var #碰到字符: 才结束变量
172
echo $var
173
174
#IFS字符分隔符和迭代器
175
#IFS是系统预订的分割符号,默认为空白字符,制表符和空格
176
data="name,sex,rollno,location"
177
oldIFS=$IFS
178
IFS=,
179
for item in $data
180
do
181
echo Item: $item
182
done
183
IFS=$oldIFS
184
185
186
187
# IFS例子
188
#!/bin/bash
189
#filename
190
data="root:x:0:0:root:/root:/bin/bash"
191
oldIFS=$IFS
192
IFS=":"
193
count=0
194
for item in $data
195
do
196
[ $count -eq 0 ] && user=$item
197
[ $count -eq 6 ] && shell=$item
198
let count++
199
done
200
echo $user
201
echo $shell
202
IFS=$oldIFS
203
204
#不知道除了 for item in $data 还有其他命令支持么
205
#shell 循环迭代
206
207
for var in list;
208
do
209
commands;
210
done
211
212
#生成数组序列
213
214
for i in {a..z};
215
for i in (1..50};
216
217
while condition
218
do
219
commands;
220
done
221
222
condition 用true 作为循环条件能产生无线循环
223
224
225
until 循环
226
在bash中还可以使用一个特殊的循环until 它会一直循环到给到定的条件
227
x=0
228
until [ $x -eq 9];
229
do
230
let x++
231
echo $x
232
done
233
234
235
#逻辑判断结构
236
if condition;
237
then
238
commands;
239
fi
240
241
if condition;
242
then
243
commands
244
elif condition;
245
else
246
commands
247
if
248
249
# 简洁版本
250
[ condition ] && action; # 如果condition为真, 则执行action
251
[ condition ] || action #如果condition 为假, 则执行action
252
253
# && 是逻辑运算符 || 逻辑或运算符
254
255
# -gt 大于
256
#-lt 小于
257
#-ge 大于或等于
258
#-le 小于等于
259
#-eq 等于
260
#-ne 不等于
261
262
#文件系统相关测试
263
[ -f $file_var ] # 如果个定的变量包含正常的文件路径或文件名,则返回真
264
[-x $var ] # 如果给定的变量包含文件可执行,则返回真
265
[-d $var] # 如果给的变量包含目录,则返回真
266
[-e $var] # 如果变量包含文件的存在,则返回真
267
[-c $var] # 如果变量包含一个字符设备文件的路径,则返回真
268
[-b $var] #如果变量包含一块设备文件的路径,则返回真
269
[-w $var] #如果变量文件可写,则返回真
270
[-r $var] #如果变量文件是否可读,则返回真
271
[-L $var] #如果变量包含一个符号链接,则返回真
272
273
#字符串比较
274
[ [ $str1 = $str2 ] ] #相等返回真
275
[ [ $str1 == $str2 ] ] # 相等返回真
276
[ [ $str1 != $str2 ] ] # 不相等返回真
277
[ [ $str1 > $str2 ] ] #如果str1的字母顺序比str2大,则返回真
278
[ [ $str1 < $str2 ] ] #如果str1的字母顺序比str2小,则返回真
279
[ [ -z $str ] ] # 如果str1包含的空字符串,则返回真
280
[ [ -n $str] ] #如果str1 包含非空字符串,则返回真
281
282
#组合判断
283
if [ [ -n $str ] ] && [ [ -z $str2 ] ];
284
then
285
commands;
286
fi
287
288
#test 命令可以节省中扩号
289
290
if [ $var -eq 0 ]; then echo "true"; fi
291
if test $var -eq 0; then echo 'true'; fi