shell笔记收藏

来源:互联网 发布:js 修改style属性 编辑:程序博客网 时间:2024/06/02 03:06

http://www.runoob.com/linux/linux-shell.html 教程地址
http://www.runoob.com/try/runcode.php?filename=helloworld&type=bash 在线编译器

笔记一:
如果不好理解的话,Shell 个人感觉可以对应成 win 中的 bat,通过代码来实现一些自动定时任务,自动备份或者执行的任务。
1、chmod +x file 加上执行权限,否则会提示无执行权限。
2、注意执行脚本时候或者全目录,或者 ./file.sh ,如果不加的话,linux 默认会从PATH 里去找该 file.sh。
3、看了这篇教程,发现脚本后缀名可以任意修改,仍然可以正常运行。

笔记二:
Linux 的字符串截取很有用。有八种方法。
假设有变量 var=http://www.aaa.com/123.htm
1. # 号截取,删除左边字符,保留右边字符。

echo ${var#*//}

其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符
即删除 http://
结果是 :www.aaa.com/123.htm
2. ## 号截取,删除左边字符,保留右边字符。

echo ${var##*/}

##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符
即删除 http://www.aaa.com/
结果是 123.htm
3. %号截取,删除右边字符,保留左边字符

echo ${var%/*}

%/* 表示从右边开始,删除第一个 / 号及右边的字符
结果是:http://www.aaa.com
4. %% 号截取,删除右边字符,保留左边字符

echo ${var%%/*}

%%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符
结果是:http:
5. 从左边第几个字符开始,及字符的个数

echo ${var:0:5}

其中的 0 表示左边第一个字符开始,5 表示字符的总个数。
结果是:http:
6. 从左边第几个字符开始,一直到结束。

echo ${var:7}

其中的 7 表示左边第8个字符开始,一直到结束。
结果是 :www.aaa.com/123.htm
7. 从右边第几个字符开始,及字符的个数

echo ${var:0-7:3}

其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数。
结果是:123
8. 从右边第几个字符开始,一直到结束。

echo ${var:0-7}

表示从右边第七个字符开始,一直到结束。
结果是:123.htm
注:(左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示)

笔记三:
%d %s %c %f 格式替代符详解:
d: Decimal 十进制整数 – 对应位置参数必须是十进制整数,否则报错!
s: String 字符串 – 对应位置参数必须是字符串或者字符型,否则报错!
c: Char 字符 – 对应位置参数必须是字符串或者字符型,否则报错!
f: Float 浮点 – 对应位置参数必须是数字型,否则报错!
如:其中最后一个参数是 “def”,%c 自动截取字符串的第一个字符作为结果输出。

$  printf "%d %s %c\n" 1 "abc" "def"1 abc d

笔记四:

$ command > file 2>&1$ command >> file 2>&1

这里的&没有固定的意思
放在>后面的&,表示重定向的目标不是一个文件,而是一个文件描述符,内置的文件描述符如下

1 => stdout2 => stderr0 => stdin

换言之 2>1 代表将stderr重定向到当前路径下文件名为1的regular file中,而2>&1代表将stderr重定向到文件描述符为1的文件(即/dev/stdout)中,这个文件就是stdout在file system中的映射
而&>file是一种特殊的用法,也可以写成>&file,二者的意思完全相同,都等价于

>file 2>&1

此处&>或者>&视作整体,分开没有单独的含义
顺序问题:

find /etc -name .bashrc > list 2>&1# 我想问为什么不能调下顺序,比如这样find /etc -name .bashrc 2>&1 > list

这个是从左到右有顺序的
第一种

xxx > list 2>&1

先将要输出到stdout的内容重定向到文件,此时文件list就是这个程序的stdout,再将stderr重定向到stdout,也就是文件list
第二种

xxx 2>&1 > list

先将要输出到stderr的内容重定向到stdout,此时会产生一个stdout的拷贝,作为程序的stderr,而程序原本要输出到stdout的内容,依然是对接在stdout原身上的,因此第二步重定向stdout,对stdout的拷贝不产生任何影响

一些简单的测试代码:

#!/bin/basharray_a=("aa" "bb" "cc" "dd")echo ${array_a[1]}echo ${array_a[@]}for i in "${array_a[@]}";doecho ${i}doneaaa="aaa bbb ccc ddd"echo `expr index "${aaa}" bbb`val=`expr 3+8`echo "两数之和为 : $val"val=`expr 3 + 8`echo "两数之和为 : $val"a=10b=20if [ ${a}==${b} ]thenecho "a等于b"fiif [ ${a}!=${b} ]thenecho "a不等于b"firead name echo "$name It is a test"echo `date`echo -e "\n"printf "\n"printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg  printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543 printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876 a=5b=6result=$[a+b] # 注意等号两边不能有空格echo "result 为: ${result}"if test ${a} -ne ${b} thenecho "a不等于b"fia=10b=20if test $a -eq $b then   echo "a 等于 b"elif test $a -gt $b then   echo "a 大于 b"elif test $a -lt $b then   echo "a 小于 b"else   echo "没有符合的条件"fii=1;while(test ${i} -lt 6)do    echo ${i}    let i++donedemoFun(){    echo "first shell function!"}demoFunfunWithReturn(){    echo "这个函数会对输入的两个数字进行相加运算..."    echo "两个数字分别为 ${1}${2} !"    return $((${1}+${2}))}funWithReturn 3 6echo "输入的两个数字之和为 $? !"
原创粉丝点击