Linux Shell的遇到的知识点1

&后台执行   && 逻辑与  前边命令成功才执行后边命令  || 逻辑或 前边命令不成功才执行后边命令 | 
mkdir -p dir  创建该目录包括父目录。
grep -c day track.sh 输出track.sh中包含‘day’的行的数量。
grep -v day track.sh 输出不包含day的行

hadoop脚本:
SOURCE="${BASH_SOURCE[0]}"  脚本相对于当前目录的路径,是相对路径
BIN_DIR="$( dirname "$SOURCE" )"  dirname得到脚本的目录名,也是相对路径。,$()与``功能相似;${var}与$var一般没啥不一样;${file:/home/sy.txt}如果没有file变量则以/home/sy.txt代替。$(($a + $b))做运算
while [ -h "$SOURCE" ] -h用来判断文件是否存在并且是个符号链接
do
SOURCE="$(readlink "$SOURCE")" //输出符号链接所指向的位置  加-f进行递归,直接输出最终文件。
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE"
BIN_DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd)"  //-P 如果要切换的目标目录是一个符号链接,直接到指向的目标目录
done
BIN_DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
LIB_DIR=$BIN_DIR/../lib

在bash shell中,$( )与` `(反引号)都是用来做命令替换(command substitution)用的。
${ }用来作变量替换:一般情况下,$var与${var}作用相同。但是用${ }会比较精确的界定变量名称的范围


 shell中$(( ))与$( )还有${ }的区别 http://blog.csdn.net/tg5156/article/details/19406275 
2014-02-18 13:46 1305人阅读 评论(0) 收藏 举报
 分类:  shell(5)  
原文地址:http://blog.zol.com.cn/2322/article_2321763.html

$( )与` `(反引号)
在bash shell中,$( )与` `(反引号)都是用来做命令替换(command substitution)用的。
$ echo the last sunday is $(date -d "last sunday" +%Y-%m-%d)
得到上一星期天的日期
用$( )的理由
1. ` `很容易与' '(单引号)搞混。有时在一些奇怪的字形显示中,两种符号是一模一样的(直竖两点)。
2. 在多层次的复合替换中,` `须要额外的跳脱(\`)处理,而$( )则比较直观。例如:
command1 `command2 `command3` `
原本的意图是在command2 `command3`中先将command3替换出来给command2处理,然后再将结果传给command1 `command2 ...`来处理。
然而,真正的结果在命令行中却是分成了`command2`与` `两段。
正确的输入应该如下:
command1 `command2 \`command3\` `
换成$( )则一目了然:
command1 $(command2 $(command3))
$( )的不足
` `基本上可在全部的unix shell中使用,若写成shell script移植性比较高。而$( )并不是每一种shell都能使用。
${ }用来作变量替换
一般情况下,$var与${var}作用相同。但是用${ }会比较精确的界定变量名称的范围,例如:
$ A=B
$ echo $AB
原本是打算先将$A的结果替换出来,然后再补一个B字母于其后,但在命令行上,真正的结果却是只会替换变量名称为AB的值出来。
使用${ }就没问题了:
$ echo ${A}B
BB
${ }的一些特异功能
定义一个变量:
file=/dir1/dir2/dir3/my.file.txt
可以用${ }分别替换获得不同的值:
${file#*/} 拿掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/} 拿掉最后一个 / 及其左边的字符串:my.file.txt
${file#*.} 拿掉第一个 . 及其左边的字符串:file.txt
${file##*.} 拿掉最后一个 . 及其左边的字符串:txt
${file%/*} 拿掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3
${file%%/*} 拿掉第一个 / 及其右边的字符串:(空值)
${file%.*} 拿掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*} 拿掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my
记忆的方法:
# 去掉左边(键盘上 # 在 $ 的左边)
% 去掉右边(在键盘上 % 在 $ 的右边)
单一符号是最小匹配,两个符号是最大匹配。
${file:0:5} 提取最左边的 5 个字节:/dir1
${file:5:5} 提取第 5 个字节右边的连续 5 个字节:/dir2
也可以对变量值里的字符串作替换:
${file/dir/path} 将第一个 dir 替换为 path:/path1/dir2/dir3/my.file.txt
${file//dir/path} 将全部 dir 替换为 path:/path1/path2/path3/my.file.txt
利用${ }还可针对不同的变量状态赋值(未设定、空值、非空值): 
${file-my.file.txt} 若 $file 未设定,则使用 my.file.txt 作传回值。(空值及非空值时不作处理) 
${file:-my.file.txt} 若 $file 未设定或为空值,则使用 my.file.txt 作传回值。(非空值时不作处理)
${file+my.file.txt} 若 $file 设为空值或非空值,均使用 my.file.txt 作传回值。(未设定时不作处理)
${file:+my.file.txt} 若 $file 为非空值,则使用 my.file.txt 作传回值。(未设定及空值时不作处理)
${file=my.file.txt} 若 $file 未设定,则使用 my.file.txt 作传回值,同时将 $file 赋值为 my.file.txt。 (空值及非空值时不作处理)
${file:=my.file.txt} 若 $file 未设定或为空值,则使用 my.file.txt 作传回值,同时将 $file 赋值为 my.file.txt。 (非空值时不作处理)
${file?my.file.txt} :若 $file 未设定,则将 my.file.txt 输出至 STDERR。(空值及非空值时不作处理)
${file:?my.file.txt} :若 $file 未设定或为空值,则将 my.file.txt 输出至 STDERR。(非空值时不作处理)
以上的理解在于,一定要分清楚 unset 与 null 及 non-null 这三种赋值状态。
一般而言,与 null 有关,若不带 : 的话,null 不受影响,若带 : 则连 null 也受影响。
${#var} 可计算出变量值的长度:
${#file} 可得到 27,/dir1/dir2/dir3/my.file.txt 刚好是 27 个字节。
bash数组(array)处理方法
一般而言,A="a b c def"只是将 $A 替换为一个单一的字符串,但是改为 A=(a b c def),则是将 $A 定义为数组。
bash的数组替换方法可参考如下方法:
${A[@]} 或 ${A[*]} 得到 a b c def(全部数组)
${A[0]} 得到 a (第一个元素),${A[1]} 第二个...
${#A[@]} 或 ${#A[*]} 得到 4 (数组数量)
${#A[0]} 得到 1 (第一个元素 a 的长度),${#A[3]} 得到 3 (第四个元素 def 的长度)
A[3]=xyz 将第四个元素重新定义为 xyz
$(( ))的用途
用来作整数运算。在 bash 中,$(( ))的整数运算符号大致有这些:
+ - * / 加、减、乘、除
% 余数运算
& | ^ ! AND、OR、XOR、NOT运算
举例:
$ a=5; b=7; c=2
$ echo $((a+b*c))
19
$ echo $(((a+b)/c))
6
$ echo $(((a*b)%c))
1
在$(( ))中的变量名称也可以在其前面加 $ 符号:$(($a+$b*$c))也可以得到 19 的结果。
此外,$(( ))还可以作不同进制(如二进制、八进位、十六进制)运算,只是输出结果皆为十进制而已。
echo $((16#2a)) 结果为 42 (16进位转十进制)
举一个实用的例子:
当前的 umask 是 022,新建文件的权限为:
$ umask 022
$ echo "obase=8; $(( 8#666 & (8#777 ^ 8#$(umask)) ))" | bc
644
事实上,单纯用(( ))也可以重定义变量值,或作testing:
a=5; ((a++)) 将 $a 重定义为 6
a=5; ((a–)) a=4
a=5; b=7; ((a < b)) 会得到 0 (true) 的返回值
常见的用于(( ))的测试符号有以下这些:
< 小于
> 大于
<= 小于或等于
>= 大于或等于
== 等于
!= 不等于

shell脚本编程支持此类运算,包括比较运算、判断文件是否存在等。基本的if条件命令选项有: - eq —比较两个参数是否相等(例如,if [ 2 –eq 5 ])
-ne —比较两个参数是否不相等 
-lt —参数1是否小于参数2 
-le —参数1是否小于等于参数2 
-gt —参数1是否大于参数2 
-ge —参数1是否大于等于参数2 
-f — 检查某文件是否存在(例如,if [ -f "filename" ]) 
-d — 检查目录是否存在 

if ....; then 
  .... 
elif ....; then 
  .... 
else 
  .... 
fi
[ -f "somefile" ] :判断是否是一个文件 
[ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限 
[ -n "$var" ] :判断$var变量是否有值 
[ "$a" = "$b" ] :判断$a和$b是否相等
    -r file     用户可读为真 
  -w file     用户可写为真 
  -x file     用户可执行为真 
  -f file     文件为正规文件为真 
  -d file     文件为目录为真 
  -c file     文件为字符特殊文件为真 
  -b file     文件为块特殊文件为真 
  -s file     文件大小非0时为真 
  -t file     当文件描述符(默认为1)指定的设备为终端时为真  
######################################################### 

a=`hdfs dfs -du /user/departmet/ | grep /user/department/gc |awk '{print $1}'`
b=`awk 'BEGIN{printf "%.2f%\n",(c/d)*100}'`

cat /etc/profile | nc -lk 9999 如果把某个文件作为nc的输入 ,把文件内容输入到9999端口
wc -l ** 可以查看文件**的行数

Linux中常常会使用到cut命令来分割字符串,下面说明下cut命令参数的使用:
         -d  指定分隔符,如:按照“:”分割,-d:
         -c  提取第n个字节,如:-c5,表示提取每行的第5个字节,-c5-14,表示提取每行的第5-14个字节,-c1,5,14,表示提取第1、5、14个字节。
         -f  指定输出的域
         实例:cut  –d:  -f1,2   //按照”:”来分割,并输出第1和2段
[root@centos ~]# cat test.txt
1:2:3
a:b:c
[root@centos ~]# cut -d: -f1,2 test.txt 后边只能接文件
1:2
a:b

  split=`echo $user|cut -d ":" -f$i` 字符串使用|这种方式

!shell脚本中的$*,$@和$#
举例说:
脚本名称叫test.sh 入参三个: 1 2 3
运行test.sh 1 2 3后
$*为"1 2 3"(一起被引号包住)
$@为"1" "2" "3"(分别被包住)
$#为3(参数数量


!linux后台运行和关闭、查看后台任务
fg、bg、jobs、&、nohup、ctrl+z、ctrl+c 命令
一、&
加在一个命令的最后,可以把这个命令放到后台执行,如
watch  -n 10 sh  test.sh  &  #每10s在后台执行一次test.sh脚本
二、ctrl + z
可以将一个正在前台执行的命令放到后台,并且处于暂停状态。
三、jobs
查看当前有多少在后台运行的命令
jobs -l选项可显示所有任务的PID,jobs的状态可以是running, stopped, Terminated。但是如果任务被终止了(kill),shell 从当前的shell环境已知的列表中删除任务的进程标识。
四、fg
将后台中的命令调至前台继续运行。如果后台中有多个命令,可以用fg %jobnumber(是命令编号,不是进程号)将选中的命令调出。
五、bg
将一个在后台暂停的命令,变成在后台继续执行。如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出。
六、kill
法子1:通过jobs命令查看job号(假设为num),然后执行kill %num
法子2:通过ps命令查看job的进程号(PID,假设为pid),然后执行kill pid
前台进程的终止:Ctrl+c
七、nohup
如果让程序始终在后台执行,即使关闭当前的终端也执行(之前的&做不到),这时候需要nohup。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。关闭中断后,在另一个终端jobs已经无法看到后台跑得程序了,此时利用ps(进程查看命令)
ps -aux | grep "test.sh"  #a:显示所有程序 u:以用户为主的格式来显示 x:显示所有程序,不以终端机来区分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunyang098

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值