1 检查可用IP
#!/bin/sh
i=0
while [ "$i" -le "255" ]
do
str="10.200.28.$i"
ping -c 4 $str | awk '{if ($1=="PING") {ip=$2} else if ($5=="received,") {if ($4==0) {print ip,"/tFree"} else {print ip, "/t/tIn use"}}}'
i=`expr $i + 1`
done
获取当前时间:date "+%Y-%m-%d %H:%M:%S"
花括号{}括起变量名:${varname},不能用$(varname)
echo ${SCPID[*]}
$'$X'
head: Displays the first few lines of a file.
head -1 file 显示file文件的第一行
head -10 file 显示file文件的前10行
set 设置环境变量 系统设置
gsub(pattern, replace, source) 模式替换
echo "NO,PRE" | awk '{gsub(/,/,"/39, /39", $0); print $0}'
输出:NO','PRE
echo "HZU/CNC-GZU/C&C NP001" | awk -F "|" '{gsub(/&/,"///&",$0);print $0}'
&替换成/&
split()
不同的系统、平台上,shell的语法有轻微的差别。
let not found的问题:
脚本中的指定的解析器为"!/bin/sh", 而在运行平台上,/bin/sh指向了dash而不是bash,dash不支持let命令。解决的方法是将脚本中的解析器改为“!/bin/bash”即可。 dash是UBUNTU上默认的 shell解析器, 与bash相比,它更小运行更快,当然它的功能也弱一些。例如在Ubuntu7.0上,bash有700k, 而dash只有70k。 另外, "echo $0"可以看到当前使用的shell。
使用:/bin/dash test.sh
while (( x <= "$BB" ))
do
done
也是bash支持的语法
$((x=$x+1))
x的值加1
关于在awk中修改shell变量的问题
在子shell中是不能修改父shell的变量的,只有使用一个中间变量来达到程序的目的
在awk中没发使用shell数组吗?
array="1 2 3 4 5"
在awk中你无法直接获得这个数组
可以改成array="1|2|3|4|5"
在awk中BEGIN{split("'$array'",myarray,"|")}{print myarray}
==
=都可以用作逻辑等
cat >hello.sh <</EOF
在提示符下输入到hello.sh直到遇到EOF
$# 位置参数个数
{}标记法是一种很好的使用位置参数的方法.这也需要间接引用(见Example 34-2)
1 args=$# # 位置参数的个数
2 lastarg=${!args}
3 # 或: lastarg=${!#}
4 # 注意 lastarg=${!$#} 将报错
#!/bin/sh
不要在脚本里面用这里
bash的功能好像要强得多
chmod a+x scriptfile
./scriptfile 11 111 22 222
能执行
x=1
while ((x<=$#))
do
echo ${!x}
let x=x+2
done
查看文件编码格式:
Windows中默认的文件格式是GBK(gb2312),而Linux一般都是UTF-8。下面介绍一下,在Linux中如何查看文件的编码及如何进行对文件进行编码转换。
DOS转UNIX
sed 's/^M//' oldfilename >newfilename (其中^M是同?Ctrl+v+m按下来输入的,表示回车符。)
dirname取目录名
basename去文件名
shell 条件判断汇总
-b file 若文件存在且是一个块特殊文件,则为真
-c file 若文件存在且是一个字符特殊文件,则为真
-d file 若文件存在且是一个目录,则为真
-e file 若文件存在,则为真
-f file 若文件存在且是一个规则文件,则为真
-g file 若文件存在且设置了SGID位的值,则为真
-h file 若文件存在且为一个符合链接,则为真
-k file 若文件存在且设置了"sticky"位的值
-p file 若文件存在且为一已命名管道,则为真
-r file 若文件存在且可读,则为真
-s file 若文件存在且其大小大于零,则为真
-u file 若文件存在且设置了SUID位,则为真
-w file 若文件存在且可写,则为真
-x file 若文件存在且可执行,则为真
-o file 若文件存在且被有效用户ID所拥有,则为真
-z string 若string长度为0,则为真
-n string 若string长度不为0,则为真
string1 = string2 若两个字符串相等,则为真
string1 != string2 若两个字符串不相等,则为真
int1 -eq int2 若int1等于int2,则为真
int1 -ne int2 若int1不等于int2,则为真
int1 -lt int2 若int1小于int2,则为真
int1 -le int2 若int1小于等于int2,则为真
int1 -gt int2 若int1大于int2,则为真
int1 -ge int2 若int1大于等于int2,则为真
!expr 若expr为假则复合表达式为真。expr可以是任何有效的测试表达式
expr1 -a expr2 若expr1和expr2都为真则整式为真
expr1 -o expr2 若expr1和expr2有一个为真则整式为真
字符串操作:
${#string}
expr length $string
expr match "$string" '$substring'
expr index $string $substring
提取子串
${string:position}
在$string中从位置$position开始提取子串.
如果$string是"*"或者"@", 那么将会提取从位置$position开始的位置参数.
${string:position:length}
字符串长度${#var}
${#*}和${#@}表示位置参数的个数.
对于数组来说, ${#array[*]}和${#array[@]}表示数组中元素的个数.
子进程设置的环境变量,会被父进程看到吗?
一个子进程, 比如说一个脚本, 是不能够修改父进程的环境变量的, 在这里也就是不能够修改shell本身的环境变量
要设置全局环境变量可能只能在/etc/profile中了
父进程, 也就是脚本本身, 将不能够读取在子进程中创建的变量, 也就是在子shell中创建的变量.
算术操作:
n=$[ $n + 1 ]
+ 加 += 加-等于
- 减 -= 减-等于
* 乘 *= 乘-等于
/ 除 /= 乘-等于
** 幂运算
% 模运算
形式: let 算式 或 expr 算式 或 ((n=n+1)) 或 n=$(($n+1)) 或 :$[n=$n+1]
变量类型:
如果变量中的值只有数字,则可以被当做一个数值进行计算
shell不支持浮点型 awk支持
一个通用的shell包装, 用来写日志文件
这里包装echo 为myecho.sh
与echo功能相同,只是会记录日志
#!/bin/bash
# 通用的shell包装,
#+ 执行一个操作, 然后把所作的操作写入到日志文件中.
# 需要设置如下两个变量.
OPERATION=echo
# 可以是一个复杂的命令链,
#+ 比如awk脚本或者一个管道 . . .
LOGFILE=log
# 命令行参数, 不管怎么样, 操作一般都需要参数. (译者注: 这行解释的是下面的OPTIONS变量, 不是LOGFILE.)
OPTIONS="$@"
# 记录下来.
echo "`date` + `whoami` + $OPERATION "$@"" >> $LOGFILE
# 现在, 执行操作.
exec $OPERATION "$@"
单引用被称为强引用
"STRING"将会阻止(解释)STRING中大部分特殊的字符.
'STRING'将会阻止STRING中所有特殊字符的解释. 这是一种比使用"更强烈的形式.