shell 使用

1、shell 将一串命令的结果 赋值给一变量

a=$(command) 

2、查看一个文件多少行

shell取得文件行数
2007-01-31 13:16

总结了一下有五种方法:
现在有一个a文件,共有55行

第一种:
# awk '{print NR}' a|tail -n1

55

第二种:

begincwcw兄的这个:

# awk 'END{print NR}' a

55

第三种:

# grep -n "" a|awk -F: '{print '}|tail -n1
55

第四种:
honbj兄的也不错:

# sed -n '$=' a
55

第五种

# wc -l a|awk '{print }'
55


第六种

#cat a |wc -l

 

3、字符串比较

比较两个字符串是否相等的办法是:
if [ "$test"x = "test"x ]; then

这里的关键有几点:
1 使用单个等号
2 注意到等号两边各有一个空格:这是unix shell的要求
3 注意到"$test"x最后的x,这是特意安排的,因为当$test为空的时候,上面的表达式就变成了x = testx,显然是不相等的。而如果没有这个x,表达式就会报错:[: =: unary operator expected

二元比较操作符,比较变量或者比较数字.注意数字与字符串的区别.
整数比较
-eq 等于,如:if [ "$a" -eq "$b" ]
-ne 不等于,如:if [ "$a" -ne "$b" ]
-gt 大于,如:if [ "$a" -gt "$b" ]
-ge 大于等于,如:if [ "$a" -ge "$b" ]
-lt 小于,如:if [ "$a" -lt "$b" ]
-le 小于等于,如:if [ "$a" -le "$b" ]
大于(需要双括号),如:(("$a" > "$b"))
>= 大于等于(需要双括号),如:(("$a" >= "$b"))
小数据比较可使用AWK
字符串比较
= 等于,如:if [ "$a" = "$b" ]
== 等于,如:if [ "$a" == "$b" ],与=等价
注意:==的功能在[[]]和[]中的行为是不同的,如下:
1 [[ $a == z* ]] # 如果$a以"z"开头(模式匹配)那么将为true
2 [[ $a == "z*" ]] # 如果$a等于z*(字符匹配),那么结果为true
3
4 [ $a == z* ] # File globbing 和word splitting将会发生
5 [ "$a" == "z*" ] # 如果$a等于z*(字符匹配),那么结果为true
一点解释,关于File globbing是一种关于文件的速记法,比如"*.c"就是,再如~也是.
但是file globbing并不是严格的正则表达式,虽然绝大多数情况下结构比较像.
!= 不等于,如:if [ "$a" != "$b" ]
这个操作符将在[[]]结构中使用模式匹配.
大于,在ASCII字母顺序下.如:
if [[ "$a" > "$b" ]]
if [ "$a" \> "$b" ]
注意:在[]结构中">"需要被转义.
具体参考Example 26-11来查看这个操作符应用的例子.
-z 字符串为"null".就是长度为0.
-n 字符串不为"null"

4、ssh远程执行命令

 

前提条件:

  配置ssh免密码登陆

对于简单的命令:

  如果是简单执行几个命令,则:

ssh user@remoteNode "cd /home ; ls"

  基本能完成常用的对于远程节点的管理了,几个注意的点:

  1. 双引号,必须有。如果不加双引号,第二个ls命令在本地执行
  2. 分号,两个命令之间用分号隔开

对于脚本的方式:

  有些远程执行的命令内容较多,单一命令无法完成,考虑脚本方式实现:

复制代码
#!/bin/bash
ssh user@remoteNode > /dev/null 2>&1 << eeooff
cd /home
touch abcdefg.txt
exit
eeooff
echo done!
复制代码

  远程执行的内容在“<< eeooff ” 至“ eeooff ”之间,在远程机器上的操作就位于其中,注意的点:

  1. << eeooff,ssh后直到遇到eeooff这样的内容结束,eeooff可以随便修改成其他形式。
  2. 重定向目的在于不显示远程的输出了
  3. 在结束前,加exit退出远程节点
 
由于集群节点较多,想把执行内容较多的写法写进until循环内,如下,总是报 unexpected end of file!不知道为何??

 

i=2 
until
test $i -gt 33 
do
  ssh user@remoteNode > /dev/null 2>&1 << eeooff
  cd /home
  touch abcdefg.txt
  exit
  eeooff
  i=$(($i+1))
done

 

另外,在shell中使用date来获取当前日期和时间的时候,可以选择格式

 

send=`date '+%Y-%m-%d %H:%M:%S'`

 

send=`date -d 'next-year' "+%Y-%m-%d"`

 

posted @ 2015-11-17 16:17  踏雪无痕何处是  阅读(307)  评论(0)    收藏  举报