sh/bash/dash/ksh/zsh等Shell脚本
-
lxf1992521
- 帖子: 240
- 注册时间: 2011-06-26 18:28
-
联系:
#31
帖子
由 lxf1992521 » 2013-11-23 22:29
best1196 写了:susbarbatus 写了:best1196 写了:lz大神你好,有个问题想请教一下,
----shell script sh1.sh---
代码: 全选
#! /bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo -e "You should input 2 integers\n" #问题代码1
read -p "first integer:" first
read -p "second integer:" second
total=$(($first * $second))
echo -e "\nThe result is : $total" #问题代码2
----shell script sh1.sh----------
我的linux是ubuntu 10.11,执行sh sh1.sh如下:
-e You should input 2 integers
first integer:2
second integer:6
-e
The result is : 12
echo完了之后参数-e也跟着输出来了,我现在想不想将这个-e显示,有什么方法吗?
直接拷下来跑了一下,没这种问题……
你的 sh 是什么版本……
试试用 bash sh1.sh
----------------------------------------------------------------
用bash sh1.sh 确实可以用,但是用 sh sh1.sh 还是不能。
至于你说的查看sh 的版本,我不知道怎么查,但我把 /bin/ 下的一些文件找出来了。
----------------------------------------
root@yx:/tmp/script# ls -l /bin/*sh
-rwxr-xr-x 1 root root 916692 2011-05-18 17:54 /bin/bash
-rwxr-xr-x 1 root root 96188 2011-05-03 23:01 /bin/dash
lrwxrwxrwx 1 root root 4 2013-07-31 14:37 /bin/rbash -> bash
lrwxrwxrwx 1 root root 4 2013-07-31 14:37 /bin/sh -> dash
lrwxrwxrwx 1 root root 7 2013-07-31 14:37 /bin/static-sh -> busybox
---------------------------------------------------------------------------------------------
sh 连接到 dash 去了,难怪会这样。
多谢。

很多新手出问题都在于:写脚本时写了魔法数字,但是运行时有用”sh“来运行,导致魔法数字没有用了,这点必须注意!
另外,Ubuntu的sh与其他Linux系统不一样,它是dash的符号链接,没有bash的一些完美的特性,注意!!!
-
lxf1992521
- 帖子: 240
- 注册时间: 2011-06-26 18:28
-
联系:
#32
帖子
由 lxf1992521 » 2013-11-24 22:48
代码: 全选
#!/bin/bash
# 本脚本用于备份 /var/cache/apt/archives 目录下的所有deb缓存包到指定目录,并将该目录下的
#+的包替换成备份目录的符号链接;
# 时间:2013年 11月 23日 星期六 22:39:52 CST
# directory of resource and target
resource_dir="/var/cache/apt/archives"
target_dir="/media/FSF/archives/archives-11.04"
# function for backuping the deb package and linking it;
backup_deb(){
if [ -d $resource_dir ]; then
cd $resource_dir || exit
ls *.deb 2> /dev/null | while read deb; do
[ ! -L $deb ] && sudo mv $deb $target_dir
done
else
echo " >> deb包文件移动失败!..."
exit
fi
}
link_deb(){
ls $target_dir/*.deb | while read deb; do
basename_deb=$(basename $deb)
[ ! -L $resource_dir/$basename_deb ] && sudo ln -s $deb $resource_dir
done
}
# body
[[ -d $target_dir ]] || sudo mkdir -p $target_dir
backup_deb
link_deb
echo " >> successful work!"
-
hybeam
- 帖子: 2
- 注册时间: 2013-04-29 10:08
- 系统: windows
#33
帖子
由 hybeam » 2013-12-05 17:07
楼主你好,能不能帮我写个脚本达成这样的目的:
每个月第一个星期五打开terminal后,会显示一段话。
我没搞过脚本,只是现用现查,打算以后要学。但是这个还是有点急的,所以求大神帮忙,救急。
我自己尝试写了个,是在/etc/bashrc文件的最后加了一个判断
if [ `date +%e`-eq`cal|awk '{print $6}'|grep '[0-9]'|head -1` ];then
/home/user1/notice/shownotice.sh
fi
#shownotice.sh这个脚本就是几行 echo “......”
可是为什么我无论什么时候打开terminal 上面都会显示shownotice.sh 中的内容,判断写错了?还是其他什么原因?
先谢谢楼主了,帮我改、给我个新的方案都行,thank you!
-
susbarbatus
- 帖子: 2966
- 注册时间: 2010-04-10 16:14
- 系统: Arch Linux
#34
帖子
由 susbarbatus » 2013-12-05 17:52
hybeam 写了:楼主你好,能不能帮我写个脚本达成这样的目的:
每个月第一个星期五打开terminal后,会显示一段话。
我没搞过脚本,只是现用现查,打算以后要学。但是这个还是有点急的,所以求大神帮忙,救急。
我自己尝试写了个,是在/etc/bashrc文件的最后加了一个判断
if [ `date +%e`-eq`cal|awk '{print $6}'|grep '[0-9]'|head -1` ];then
/home/user1/notice/shownotice.sh
fi
#shownotice.sh这个脚本就是几行 echo “......”
可是为什么我无论什么时候打开terminal 上面都会显示shownotice.sh 中的内容,判断写错了?还是其他什么原因?
先谢谢楼主了,帮我改、给我个新的方案都行,thank you!
cal|awk '{print $6}'|grep '[0-9]'|head -1 的结果,虽然打印出来是个数字,比如5,但其实是 $'_\b5',
date +%e 拿到的值前面有个空格,
所以 -eq 不适用,加引号用字符串对比也得不到正确结果。
沉迷将棋中……
-
susbarbatus
- 帖子: 2966
- 注册时间: 2010-04-10 16:14
- 系统: Arch Linux
#35
帖子
由 susbarbatus » 2013-12-05 18:11
date +%u 可以打出今天星期几
date +%-d 可以打出前面不带填充的日期
一周的第一个星期五一定小于7号,第二个星期五一定大于7号(对于星期几都是这样)
于是判断条件可以这么写
if [ `date +%-d` -lt 7 ] && [ `date +%u` -eq 5 ];then
echo something...
fi
沉迷将棋中……
-
lxf1992521
- 帖子: 240
- 注册时间: 2011-06-26 18:28
-
联系:
#36
帖子
由 lxf1992521 » 2013-12-06 12:13
susbarbatus 写了:date +%u 可以打出今天星期几
date +%-d 可以打出前面不带填充的日期
一周的第一个星期五一定小于7号,第二个星期五一定大于7号(对于星期几都是这样)
于是判断条件可以这么写
if [ `date +%-d` -lt 7 ] && [ `date +%u` -eq 5 ];then
echo something...
fi
恩,赞一个!!

-
hybeam
- 帖子: 2
- 注册时间: 2013-04-29 10:08
- 系统: windows
#37
帖子
由 hybeam » 2013-12-06 13:18
susbarbatus 写了:date +%u 可以打出今天星期几
date +%-d 可以打出前面不带填充的日期
一周的第一个星期五一定小于7号,第二个星期五一定大于7号(对于星期几都是这样)
于是判断条件可以这么写
if [ `date +%-d` -lt 7 ] && [ `date +%u` -eq 5 ];then
echo something...
fi
我已经用了你的方法,很棒的,非常感谢!我明白了为什么我的方案不能工作,再次感谢你的讲解!
-
susbarbatus
- 帖子: 2966
- 注册时间: 2010-04-10 16:14
- 系统: Arch Linux
#38
帖子
由 susbarbatus » 2013-12-06 13:30

发现点小问题,不是小于7号,应该是小于等于7号,于是 -le 才是对的,此外把两个判断交换一下效率更高些
if [ `date +%u` -eq 5 ] && [ `date +%-d` -le 7 ]; then
echo something...
fi
沉迷将棋中……
-
ardin
- 帖子: 39
- 注册时间: 2007-01-28 16:08
#41
帖子
由 ardin » 2014-04-25 15:57

还有这样的好人,不好好麻烦他一下都不好意思。。
帮忙写一个:判断指定网段中还有没有活的机器,如果没有,就关掉自己。
本机装了arping的,最好还要有Log。
-
lxf1992521
- 帖子: 240
- 注册时间: 2011-06-26 18:28
-
联系:
#42
帖子
由 lxf1992521 » 2014-04-25 20:07
ardin 写了:
还有这样的好人,不好好麻烦他一下都不好意思。。
帮忙写一个:判断指定网段中还有没有活的机器,如果没有,就关掉自己。
本机装了arping的,最好还要有Log。
恩,使用arp-scan命令即可,比如:“sudo arp-scan --interface=wlan0 192.168.1.0/24”即可通过无线网络扫描192.168.1.0/24网段是否有活动主机!
具体用法请baidu,或者man手册
-
ardin
- 帖子: 39
- 注册时间: 2007-01-28 16:08
#43
帖子
由 ardin » 2014-04-28 14:45
lxf1992521 写了:ardin 写了:
还有这样的好人,不好好麻烦他一下都不好意思。。
帮忙写一个:判断指定网段中还有没有活的机器,如果没有,就关掉自己。
本机装了arping的,最好还要有Log。
恩,使用arp-scan命令即可,比如:“sudo arp-scan --interface=wlan0 192.168.1.0/24”即可通过无线网络扫描192.168.1.0/24网段是否有活动主机!
具体用法请baidu,或者man手册
lxf1992521 你是个懒人啊!为什么给best1196兄弟的写得就完整,给我就只一句提示呢?
算了,伟大领袖曾经说过“自力更生,丰衣足食”,"扫帚不到,灰尘照例不会自己跑掉" ,咱自己写一个!
代码: 全选
#!/bin/bash
IPaddr=192.168.1.
ETHX=enp2s0
IPFILE=/tmp/arping.txt
LogFile=/var/log/auto-down.log
# 只扫描 192.168.1.71-192.168.1.250 之间的机器。
for IP in {71..250}
do
arping -I $ETHX -c 1 $IPaddr$IP > $IPFILE
result=$(cat $IPFILE | grep reply)
if [[ "$result" != "" ]]
then
echo " at `date`, still has machine run." >> $LogFile
echo $result >> $LogFile
echo "so Don't Panic." >> $LogFile
exit 1
fi
done
if [[ "$result" == "" ]]
then
# 关闭网中的windows 2003 服务器。
echo "关闭windows 2003 服务器 -- 192.168.1.62" >> $LogFile
net rpc shutdown -f -U Administrator%password -I 192.168.1.62
# 注意:现在要关机!!
echo " at `date`, halt machine." >> $LogFile
echo " halt!!! I real run THIS command! " >> $LogFile
rm $IPFILE
/sbin/halt -p
fi
注意注意: 此脚本有危险操作,不了解其含义的最好不要运行它。
-
daf3707
- 论坛版主
- 帖子: 12739
- 注册时间: 2007-06-13 15:57
- 来自: 在他乡
#44
帖子
由 daf3707 » 2014-04-28 14:46
今天才几号,这脚本超前了?
-
lxf1992521
- 帖子: 240
- 注册时间: 2011-06-26 18:28
-
联系:
#45
帖子
由 lxf1992521 » 2014-04-28 21:25
lxf1992521 你是个懒人啊!为什么给best1196兄弟的写得就完整,给我就只一句提示呢?
算了,伟大领袖曾经说过“自力更生,丰衣足食”,"扫帚不到,灰尘照例不会自己跑掉" ,咱自己写一个!
呃,这个真的没什么技术含量啊!既然如此,我写一下吧:
代码: 全选
#!/bin/bash
# 变量设置
logfile="/var/log/arpscan.log"
net="192.168.1.0/24"
# 函数主体
hostnumber=$( sudo arp-scan --interface=wlan0 $net 2>&1 | sudo tee $logfile | grep "packets received by filter" | sed -r 's/^([0-9])(.*)/\1/' )
[ $hostnumber -eq 0 ] && sudo init 0