shell学习

$0 这个程式的执行名字
$n 这个程式的第n个参数值,n=1..9
$* 这个程式的所有参数,此选项参数可超过9个。
$# 这个程式的参数个数
$$ 这个程式的PID(脚本运行的当前进程ID号)
$! 执行上一个背景指令的PID(后台运行的最后一个进程的进程ID号)
$? 执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
$- 显示shell使用的当前选项,与set命令功能相同
$@$*类似,但是可以当作数组用
if:

if ()
then
...
else
...
fi

-c    当file存在并且是字符文件时返回真
-d    当pathname存在并且是一个目录时返回真
-e    当pathname指定的文件或目录存在时返回真
-f     当file存在并且是正规文件时返回真
-g     当由pathname指定的文件或目录存在并且设置了SGID位时返回为真
-h     当file存在并且是符号链接文件时返回真,该选项在一些老系统上无效
-k     当由pathname指定的文件或目录存在并且设置了“粘滞”位时返回真
-p     当file存在并且是命令管道时返回为真
-r     当由pathname指定的文件或目录存在并且可读时返回为真
-s     当file存在文件大小大于0时返回真
-u     当由pathname指定的文件或目录存在并且设置了SUID位时返回真
-w    当由pathname指定的文件或目录存在并且可执行时返回真。一个目录为了它的内容被访问必然是可执行的。
-o     当由pathname指定的文件或目录存在并且被子当前进程的有效用户ID所指定的用户拥有时返回真。
打开/home/folder/01.sh
编辑:
#!/bin/bash
#打印shell脚本的目录
bashDir=$(cd "$(dirname "$0"); pwd)
echo $baseDir

执行01.sh
打印:/home/folder
pushdpopd
将目录看作堆栈来用
字符串替换:
#echo qwert > /home/folder/01.sh
#vi /home/folder/02.sh
sed -i "s/qwe/123/" /home/folder/01.sh > /home/folder/02.sh
#chmod +x /home/folder/02.sh
#sh /home/folder/02.sh
#cat /home/folder/01.sh
打印:123rt

-i表示将操作的结果直接写入文件中
s是替换,/在这里是s替换的格式  一般的情况下格式是这样的 s/字符串1/字符串2/
表示将字符串1替换为字符串2
\"  表示  "
整个一句表示在01.sh中将qwe替换成123
for:

for i in "$@"
do
...
done;
遍历并操作每一个命令行选项
case:

case "$i" in 

"$condition1" ) 
command... 
;; 
"$condition2" ) 
command... 
;; 
esac  
DIRNAME="${i#*=}"
表示:删除(#)i中等号(=)前面的所有内容(*),得到的剩余内容赋值给DIRNAME

#!/bin/sh
files=`find -name *.conifg`
for i in $files
do
  name=${i#*/}
  dir=${name%/*}
done
name和dir都代表什么呢?
假如
i=this/is/a/path.config
那么
name=is/a/path.config
dir=this/is/a

也就是说%/*代表取从头到最后一个slash之前的所有内容
#*/代表去取从第一个slash之后的所有内容

也就是说
#代表删除从前往后最小匹配的内容
%代表删除从后往前最小匹配的内容
shift:

cat shift.sh
#------------------输出文字-开始--------------
#!/bin/bash
until [ -z "$1" ]  # Until all parameters used up
do
  echo "$@ "
  shift
done
#------------------输出文字-结束-------------

sh shift.sh 1 2 3 4 5 6 7 8 9
#------------------输出文字-开始--------------
1 2 3 4 5 6 7 8 9
2 3 4 5 6 7 8 9
3 4 5 6 7 8 9
4 5 6 7 8 9
5 6 7 8 9
6 7 8 9
7 8 9
8 9
9
#------------------输出文字-结束--------------
标准输出定向:

> /dev/null表示把标准输出重定向到/dev/null,也就是不在屏幕上输出标准输出
>& /dev/null表示把标准输出和错误输出重定向到/dev/null,程序不在屏幕上输出
egrep:

egrep "123" /home/folder/01.sh
在01.sh中查找含有123内容在第几行
useradd:

useradd –d /usr/sam -m sam
创建了一个用户sam

主要参数
-c:加上备注文字,备注文字保存在passwd的备注栏中。 
-d:指定用户登入时的启始目录。
-D:变更预设值。
-e:指定账号的有效期限,缺省表示永久有效。
-f:指定在密码过期后多少天即关闭该账号。
-g:指定用户所属的起始群组。
-G:指定用户所属的附加群组。
-m:自动建立用户的登入目录。
-M:不要自动建立用户的登入目录。
-n:取消建立以用户名称为名的群组。
-r:建立系统账号。
-s:指定用户登入后所使用的shell。
-u:指定用户ID号。
sudo / sudoers :

sudo 是linux下常用的允许普通用户使用超级用户权限的工具,允许系统管理员让普通用户执行一些或者全部的root命令。这样不仅减少了root用户的登陆和管理时间,同样也提高了安全性。
sudo的配置文件是sudoers文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。它所存放的位置默认是在/etc/sudoers,属性必须为0411
chown -R
使用参数 -R,改变目录及其文件用户和群组
xargs:
xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理。

find -type f -name "*.sh" | xargs sudo chmod +x
找到所有*.sh,并给它们加执行权限

# find /etc -name "*.conf" | xargs ls –l
获得/etc/ 下所有*.conf 结尾的文件列表,有几种不同的方法能得到相同的结果,下面的例子仅仅是示范怎么实用xargs ,在这个例子中实用 xargs将find 命令的输出传递给ls -l

# ls *.jpg | xargs -n1 -i cp {} /external-hard-drive/directory
拷贝所有的图片文件到一个外部的硬盘驱动 
find:

find /home/folder -name "*.sh" -exec chmod +x {} \;
找到folder中所有的sh文件,并赋予执行权限
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值