`

shell编程小点笔记

 
阅读更多

linux shell脚本的一些基础点

1.标准输入和输出 0 1 2
0>;表示stdin标准输入
1>:表示stdout标准输出
2>:表示stderr错误输出

看个例子:
./start.sh >/dev/null 2>&1

1: start.sh 命令脚本
2:/dev/null 代表空设备文件
3:2> 表示stderr标准错误
4:& 表示等同于的意思,2>&1,表示2的输出重定向等同于1
5:1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于 "1>/dev/null"

因此,>/dev/null 2>&1也可以写成“1> /dev/null 2> &1”

那么本文标题的语句执行过程为:
1>/dev/null :首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。
2>&1 :接着,标准错误输出重定向 到 标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。

一个相对完整的启动方式是

./command.sh >/dev/null 2>1& &(后台进程启动)

2.变量赋值建议不使用空格,因为会被当做命令来处理

3.(())和 $(())之间区别
(()):会将括号内的表达式做运算处理
$(()):当做运算处理,并将结果返回
看个例子;

var1=1;
var2=2;

var3=$((var1 < var2))
var4=$((var1 > var2))
echo 'var3:' $var3
echo 'var4:' $var4

var5=((var1 < var2))    //这句会报错,因为没有返回值,不能对var5进行赋值
echo $var5
---------结果------------
var3:1     // 若是未true 则返回1 。flase 返回0
var4:0

 

4. &&和||
AA && BB  ==== >  if [ A ];then BB ;fi    如果AA成立 才执行BB
常用做法: cd /home/tmp &&rm -rf *
AA || BB  ==== >  if [ A ];then ;else BB ;fi 如果AA 成立的话,那么去执行 BB
常用的做法是 cd /home/tmp || exit 1

5.if 后面跟的是一个条件表达式
语法:
if [ condition ];then do something ; fi

condition 中条件大于 1 即可
if [ -z "$1" ];then echo 'the file is existed' ; fi
if [ grep -P 'bin' fielname|wc -l ]; then do something ; fi

6.touch && echo && {}
touch aa 快速建立一个a文件
touch {1..10}  快速建立文件名从1到10的文件
touch [1..10]  不会建立任何的文件

echo * 
1.若是文件夹有文件或目录,会输出所有的文件或目录
2.若是文件夹为空的话,会输出 *

echo ? //匹配单个字符的文件或是目录并输出
echo {1..10} 输出1-10的数字

通过以上的例子可以看出 {}会是做循环遍历,再看个。

for i in {1..5} ; do echo $i ; done
---------结果如下所示:---------
1
2
3
4
5

 

7.几个特殊符号
1.`` 执行符号中的脚本并发挥结果
2.~  指定到 /home/loginid
3.基本的shell命令都是以 空格作为分隔符 例如 awk 等
4."" , '' 输出字符串

   aa=1
   echo "$aa"      // 1
   echo "\$aa"     // $aa
   echo '$aa'      // $aa

 

   若是中间包含 $aa 则解析该变量,得到1 ,若是不想解析 \$aa 这样输出的就是 $aa

8.参数变量
$#: 获取参数个数
$?: 上一个命令结果 成功是 0 失败为1
$@: 输出参数
$*: 输出参数
"$@" 返回一个数组

# !/bin/bash

for i in "$@"
do
    echo $i
done
------------
./para.sh 11 ee ff
11
ee
ff

 

"$*" 返回一个字符串

for i in "$*"
do
    echo $i
done
-------------
./para.sh 11 22
11 22

 

不加双引号的 $@和$*基本没什么区别

 

$#的几个特殊用处

 var=1abcdefg
 echo ${#var}   --- 8
 echo ${var:0:5} --- 1abcd
 echo ${var/1*/5678} --- 5678

 

$$: 当前的进程号 没什么用处
 
 设置局部变量 local  没什么特别的 ,变量不加 local ,那么就是全局的

 
 9。命令执行的顺序
 1.alias 定义的命令
 2.function定义命令
 3.内部命令 系统自身带的命令  一般也是默认$PATH
 4.外部命令  $PATH中另外加的
 
 
 10.命令行中几个快捷键
 ctrl + w  :删除最后一个输入 以空格为分隔符
 ctrl + v  :删除一行命令行
 ctrl + y  :撤销上一个命令
 ctrl + a  :移动到命令行首
 ctrl + e  :移动到命令行尾

 11.nuhup 就是以后台程序启动程序 ,也可以说是精灵进程
 nohup command &
 无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。
 
 更倾向于直接使用 & 来简单
 
 12. grep 的几个使用小技巧
 grep -v  "hah" filename : 查询非hah的数据
 grep -o  使用正则表达式
 grep -P  使用Perl的正则表达式
 grep "line 5" filename -A1 :匹配到数据后再将下一行的数据显示出来
 grep "line 5" filename -B1 :匹配到数据后再将上一行的数据显示出来
 grep -n :匹配到数据后,除了显示匹配的内容外,另外显示行号
 
 
 13. sed 和 awk 较为复杂,另作笔记吧
 
 
 
 
  

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics