shell笔记

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中所有特殊字符的解释. 这是一种比使用"更强烈的形式.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值