eval实际上是对后面的算式或者表达式执行两次解释。
例如
a=sc
bsc=feiye
echo $a
eval echo "$"b$a
最后一句实际上是执行了2次。
第一次是得到 echo $bsc,再执行一次就得到了feiye
1.将$()将命令括起来。
如
a=$(whoami)
echo $a
2.将``将命令括起来。[注意:`是~号对应的键]
如
a=`whoami`
echo $a
1.如何是第一行或者最后一行,可以用 head -n 1或者tail -n 1得到
2.如果是想要得到文件中的某个满足条件的行,可以用while read line结构的程序。
如
file=/home/test/input.dat
cat $file | while read line
do
if [ echo $line|grep test -q ]
do
echo "get it"
fi
done
1.用while read line读取文件中的每行,用 函数读取变量
如
line=“test string”
readstr()
{
read var1 var2
echo $var1
echo $var2
}
echo $line|readstr
2.用awk实现
如
line=test string
var1=`echo $line|awk '{print $1}'`
var2=`echo $line|awk '{print $2}'`
使用 tr -d '/n/r'
1.利用grep
如:
echo $str1|grep "*g09?" -q
echo $?
判断str1字符中是否匹配后面的模式,如果匹配则$?的值为0,否则为非0
2.利用 =~
如:
if [[ " sc test cs" =~ " test " ]]
then
echo "true"
else
echo "false"
fi
1.用(( ))将需要比较的数字括起来。
(($num1 == $num2)) (($num1 != $num2)) (($num1 >= $num2))
(($num1 <= $num2)) (($num1 > $num2)) (($num1 < $num2))
2.用比较符号 -eq -gt -ge -lt -le -ne来比较
[ $num1 -eq $num2 ] (=) [ $num1 -gt $num2 ] (>) [$num1 -ge $num2 ](>=)
[ $num1 -lt $num2 ] (<) [ $num1 -le $num2 ] (<=) [ $num1 -ne $num2 ] (!=)
在函数中返回值的方法有多种。
1.利用全局变量,在子函数中改变全局变量,结果将会保存到函数结束。
2.在函数中通过result语句来返回值,但是只能返回一个0-127范围的数值,用 &? 来获取函数执行后的结果。
3.通过echo 方法
通过 &?来取得一个函数的返回值,如果函数中没有返回值,则该值为函数中最后一个命令的执行结果。
shell命令的执行结果,值为0表示为真,值非0表示为假。
父shell变量传递到子shell只需要用export 就可以了,子shell对变量的改变将不会影响父shell。
子shell变量传递到父shell,还没有找到完美的,我知道暂时只能通过临时文件来传递。
一般文件只有3中权限 w,r,x,分别表示可写,可读,可执行.
某些特殊文件还有s权限或者t权限。
例如
ll /usr/bin/passwd
-rwsr-xr-x 1 root shadow 79336 2007-05-04 19:28 /usr/bin/passwd
ll /
drwxrwxrwt 34 root root 2488 2010-01-30 21:20 tmp
我们看到passwd的User位置有个s权限,它表示运行它的用户将会以该文件的属主身份来执行。
所以普通用户可以运行passwd来修改自己的命令(虽然/etc/passwd是root用户的)
同样的在Group位置也可以设置s权限,它同suid类似,运行它的用户将会以该文件的组身份来执行。
t权限只对目录有效果,它的作用就是所有用户都可以自由建立文件和文件夹,但是只能删除自己建立的文件或者文件夹,
这对于/tmp的意义是非常重要的。
对文件加suid(4)权限 chmod 4755 file
对文件加sgid(2)权限 chmod 2755 file
对文件加t权限(1)权限 chmod 1777 file
对目录加suid,sgid,t权限 chmod 7777 directory
需要注意的是
1.suid,guid只能对应于二进制文件,对shell无效
2.guid和uid,除了上面所说的作用外,guid还一般用来使某个目录内创建的文件都具有某个组权限。
3.s权限的前提是x权限,如果文件没有x权限而被赋予s权限,将会显示大写的S.