新手学shell写脚本,希望多多指教

sh/bash/dash/ksh/zsh等Shell脚本
头像
photor
论坛版主
帖子: 11004
注册时间: 2008-04-26 12:41

Re: 新手学shell写脚本,希望多多指教

#16

帖子 photor » 2009-01-21 23:25

gududehuo 写了:
我这里没有提示让我指定文件格式(我试验挂载的是一个wubi安装的root.disk文件),而是直接出现了如附件所示的错误信息,并且创建的空文件夹没有删
我改了下,脚本里确实有错误,可能替换的时候替换错了, :em06
photor再帮我试下
mountiso.tar.gz
这个ok了,楼主再接再励,解决无法卸载的臭虫 :em09
gududehuo
帖子: 92
注册时间: 2008-05-25 22:58

Re: 新手学shell写脚本,希望多多指教

#17

帖子 gududehuo » 2009-01-21 23:30

:em06 正在解决正在解决
不过我都能正常卸载,
头像
photor
论坛版主
帖子: 11004
注册时间: 2008-04-26 12:41

Re: 新手学shell写脚本,希望多多指教

#18

帖子 photor » 2009-01-22 0:15

gududehuo 写了::em06 正在解决正在解决
不过我都能正常卸载,
是不是因为路径中有空格造成的?我挂载的文件是
/media/disk/Documents/My Virtual Machines/WINME.iso
gududehuo
帖子: 92
注册时间: 2008-05-25 22:58

Re: 新手学shell写脚本,希望多多指教

#19

帖子 gududehuo » 2009-01-22 16:27

photor 写了:
gududehuo 写了::em06 正在解决正在解决
不过我都能正常卸载,
是不是因为路径中有空格造成的?我挂载的文件是
/media/disk/Documents/My Virtual Machines/WINME.iso
我能正常卸载,你是所有的挂载光盘都不能卸载吗
头像
photor
论坛版主
帖子: 11004
注册时间: 2008-04-26 12:41

Re: 新手学shell写脚本,希望多多指教

#20

帖子 photor » 2009-01-22 18:54

昨天是在8.10上试验的,路径中带不带空格都不行,今天我换了一台机器,是8.04的,可以成功卸载,而且路径中含有空格的也可以,没明白咋回事
而且在新机器上还发现了一个问题:文件名中有空格不行(有n个空格显示n+1个错误信息),这个绝对是可以重复的臭虫 :em20
gududehuo
帖子: 92
注册时间: 2008-05-25 22:58

Re: 新手学shell写脚本,希望多多指教

#21

帖子 gududehuo » 2009-01-22 20:19

photor 写了:昨天是在8.10上试验的,路径中带不带空格都不行,今天我换了一台机器,是8.04的,可以成功卸载,而且路径中含有空格的也可以,没明白咋回事
我系统是8.10的
而且在新机器上还发现了一个问题:文件名中有空格不行(有n个空格显示n+1个错误信息),这个绝对是可以重复的臭虫 :em20
错误提示是加载出错还是卸载出错呢
头像
photor
论坛版主
帖子: 11004
注册时间: 2008-04-26 12:41

Re: 新手学shell写脚本,希望多多指教

#22

帖子 photor » 2009-01-22 20:37

gududehuo 写了:
photor 写了:昨天是在8.10上试验的,路径中带不带空格都不行,今天我换了一台机器,是8.04的,可以成功卸载,而且路径中含有空格的也可以,没明白咋回事
我系统是8.10的
而且在新机器上还发现了一个问题:文件名中有空格不行(有n个空格显示n+1个错误信息),这个绝对是可以重复的臭虫 :em20
错误提示是加载出错还是卸载出错呢
卸载
gududehuo
帖子: 92
注册时间: 2008-05-25 22:58

Re: 新手学shell写脚本,希望多多指教

#23

帖子 gududehuo » 2009-01-22 22:45

photor 写了:
gududehuo 写了:
photor 写了:昨天是在8.10上试验的,路径中带不带空格都不行,今天我换了一台机器,是8.04的,可以成功卸载,而且路径中含有空格的也可以,没明白咋回事
我系统是8.10的
而且在新机器上还发现了一个问题:文件名中有空格不行(有n个空格显示n+1个错误信息),这个绝对是可以重复的臭虫 :em20
错误提示是加载出错还是卸载出错呢
卸载
我已经更新脚本了,增加了显示哪些程序在访问加载点,并且可以结束访问的进程。
:em06 :em06 我怎么卸载都正常的,

:em06 :em06 :em06 :em06 功力还不够,看来还得区啃书。 :em11 :em11 :em11 :em11
头像
photor
论坛版主
帖子: 11004
注册时间: 2008-04-26 12:41

Re: 新手学shell写脚本,希望多多指教

#24

帖子 photor » 2009-01-22 22:59

gududehuo 写了:
photor 写了:
gududehuo 写了:
photor 写了:昨天是在8.10上试验的,路径中带不带空格都不行,今天我换了一台机器,是8.04的,可以成功卸载,而且路径中含有空格的也可以,没明白咋回事
我系统是8.10的
而且在新机器上还发现了一个问题:文件名中有空格不行(有n个空格显示n+1个错误信息),这个绝对是可以重复的臭虫 :em20
错误提示是加载出错还是卸载出错呢
卸载
我已经更新脚本了,增加了显示哪些程序在访问加载点,并且可以结束访问的进程。
:em06 :em06 我怎么卸载都正常的,

:em06 :em06 :em06 :em06 功力还不够,看来还得区啃书。 :em11 :em11 :em11 :em11
给个贴图吧,我这里这么没看见有什么界面显示你说的新功能,还是跟以前一样?
gududehuo
帖子: 92
注册时间: 2008-05-25 22:58

Re: 新手学shell写脚本,希望多多指教

#25

帖子 gududehuo » 2009-01-22 23:07

图片
我的xpdf正在运行光盘里的文件,我运行脚本会出现出错提示,然后暗确定就出现是什么程序在访问光盘了,按确定就会kill掉访问程序,然后卸载光盘,删除目录。
头像
photor
论坛版主
帖子: 11004
注册时间: 2008-04-26 12:41

Re: 新手学shell写脚本,希望多多指教

#26

帖子 photor » 2009-01-23 21:09

gududehuo 写了:图片
我的xpdf正在运行光盘里的文件,我运行脚本会出现出错提示,然后暗确定就出现是什么程序在访问光盘了,按确定就会kill掉访问程序,然后卸载光盘,删除目录。
你那里文件名带空格时也能正常卸载吗?看来这样调试没什么线索。可惜我对脚本不熟,只能抽时间再好好折腾你的源代码了 :em06
gududehuo
帖子: 92
注册时间: 2008-05-25 22:58

Re: 新手学shell写脚本,希望多多指教

#27

帖子 gududehuo » 2009-01-24 13:25

漫漫折腾吧,可惜最近没时间
头像
photor
论坛版主
帖子: 11004
注册时间: 2008-04-26 12:41

Re: 新手学shell写脚本,希望多多指教

#28

帖子 photor » 2009-01-25 18:09

已经搞定了。原因是不能用umount /dev/loop0之类的方式来卸载,要用umount /media/WINME.iso。代码如下(为防止功能太多造成调试上的麻烦,还是用的你没有加新功能的版本来改的):

代码: 全选

#! /bin/bash

if [ ! -z "$1" ]; then
NAUTILUS_SCRIPT_SELECTED_FILE_PATHS=$1
fi
isopath=$(echo "${NAUTILUS_SCRIPT_SELECTED_FILE_PATHS}" | sed 's/ /\\ /g ; s/(/\\(/g ; s/)/\\)/g ; s/&/\\&/ ; s/;/\\;/')
test="readlink -f $isopath "
isopath=`eval $test`
isofilename=$(echo "${isopath}" | sed 's/^\/.*\///')

rm /tmp/samenamefilepath
rm /tmp/filepath
rm /tmp/mounterror
rm /tmp/mountedlist.txt
rm /tmp/mountpointlist
rm /tmp/delerror.txt

echo -e '\r' | sudo losetup -a
if [ $? -eq 1 ]
then
mima=$(zenity --title="请输入密码" --hide-text ---entry --text=由于加载光盘需要root权限,请输入root密码)
echo $mima | sudo -S losetup -a
fi
if [ $? -eq 1 ]
then
mima=$(zenity --title="请输入密码" --hide-text --entry --text=不要挑战我的耐心,密码还是错误,请重新输入ROOT密码)
echo $mima | sudo -S losetup -a
fi
if [ $? -eq 1 ]
then
mima=$(zenity --title="请输入密码" --hide-text --entry --text=我受不了了,密码还是错误,请重新输入ROOT密码)
echo $mima | sudo -S losetup -a
fi
if [ $? -eq 1 ]
then
zenity --info --title="退出" --text=你退出吧,我无话可说!
exit
fi
#zenity --info --text=$mima
#######################################################
function umountdevice() {
loadediso=$(sudo losetup -a)
if [ "${loadediso}" != "" ] ; then
sudo losetup -a | grep /dev/loop | sed 's/\:.* (/ / ; s/),*.*/ /' | while read looppath isloaded ; do
isoloadpath=$(sudo mount|grep "$looppath" | sed 's/^.* on // ; s/ type.*$//')

isloaded=$(echo ${isloaded} | sed 's/ /\\ /g ; s/(/\\(/g ; s/)/\\)/g;s/&/\\&/; s/;/\\;/')
isoloadpath=$(echo ${isoloadpath} | sed 's/ /\\ /g ; s/(/\\(/g ; s/)/\\)/g;s/&/\\&/; s/;/\\;/')

echo -n FALSE >> /tmp/mountedlist.txt
echo -n " " >> /tmp/mountedlist.txt
echo -n ${looppath} >> /tmp/mountedlist.txt
echo -n " " >> /tmp/mountedlist.txt
echo -n ${isoloadpath} >> /tmp/mountedlist.txt
echo -n "/ " >> /tmp/mountedlist.txt
echo -n ${isloaded} >> /tmp/mountedlist.txt
echo -n " " >> /tmp/mountedlist.txt
done
xianshilist="zenity --title="已加载的loop设备" --width=1000 --height=350 --list --checklist --column="选择" --column="loop设备" --column="加载点" --column="文件路径" $(cat /tmp/mountedlist.txt)" 
selectlist=`eval ${xianshilist}`
selectlist=$(echo $selectlist | sed 's/|/ /g')

echo $selectlist | sed 's/ /\n/g' | while read looppath ; do
[ "${looppath}"x == ""x ] && exit 0
isoloadpath=`sudo mount|grep "${looppath}" | sed 's/^.* on // ; s/ type.*$//'`
echo -n "${isoloadpath}" | sed 's/ /\\ /g ; s/(/\\(/g ; s/)/\\)/g;s/&/\\&/; s/;/\\;/' >> /tmp/mountpointlist
echo -n "/ " >> /tmp/mountpointlist
done

deldirlist="`cat /tmp/mountpointlist`"
umounttest="sudo umount "$deldirlist""
eval $umounttest

[ "${deldirlist}"x == ""x ] && exit 0
deldir="sudo rmdir "${deldirlist} 2>> /tmp/delerror.txt""
eval $deldir 2>> /tmp/delerror.txt

[ -s /tmp/delerror.txt ] && zenity --title= --text-info --filename=/tmp/delerror.txt

exit 0
fi

[ "${loadediso}"x == ""x ] && zenity --title= --info --text=你没有加载任何的loop设备
}
##################################################################
if [ -d "${isopath}" ] ; then
umountdevice
exit 0
fi

if [ -z ${NAUTILUS_SCRIPT_SELECTED_FILE_PATHS} ] && [ ! -z ${NAUTILUS_SCRIPT_CURRENT_URI} ] ; then
umountdevice
exit -
fi
##################################################################
loadediso=$(sudo losetup -a)
appurl=`echo "${isopath}" | sed 's/^\/.*\///'` #| sed 's/.iso//'`
nrgtest=`echo "${isopath}" | grep "\(\.nrg\)$"`
if [ ! -z "$nrgtest" ]; then
offset="offset=307200"
fi
[ "${loadediso}"x = ""x ] && [ -d /media/"${appurl}" ] && sudo mount -o loop,iocharset=utf8,"${offset}" "${isopath}" /media/"${appurl}" 2> /tmp/mounterror

[ "${loadediso}"x = ""x ] && [ ! -d /media/"${appurl}" ] && sudo mkdir /media/"${appurl}" && sudo mount -o loop,iocharset=utf8,"${offset}" "${isopath}" /media/"${appurl}" 2> /tmp/mounterror
#[ -s /tmp/mounterror ] && sudo rmdir /media/"${appurl}"

[ "${loadediso}" != "" ] && sudo losetup -a | grep /dev/loop | sed 's/\:.* (/ / ; s/)$//' | while read looppath isloaded ; do
   isloadedfilename=$(echo $isloaded | sed 's/^\/.*\///')
   [ "${isloaded}" != "${isopath}" ] && [[ "${isofilename}" != "${isloadedfilename}" ]] && continue
   [ "${isloaded}" != "${isopath}" ] && [ "${isofilename}" == "${isloadedfilename}" ] && isoloadpath=`sudo mount|grep "$looppath" | sed 's/^.* on // ; s/ type.*$//'` && echo "${isoloadpath}" > /tmp/samenamefilepath && continue
   [ "${isloaded}" == "${isopath}" ] && isoloadpath=`sudo mount|grep "$looppath" | sed 's/^.* on // ; s/ type.*$//'` && echo "${isoloadpath}" > /tmp/filepath
done
if [ -f /tmp/samenamefilepath ] ; then
while read isoloadpath ; do
zenity --title= --info --text=你选择的文件没有加载,但已经有一个同名文件已经加载到了"${isoloadpath}"
done < /tmp/samenamefilepath
fi

if [ -f /tmp/filepath ] ; then
while read isoloadpath ; do
zenity --title= --info --text=你选择的文件已经加载到了"${isoloadpath}"
done < /tmp/filepath
fi

if [ ! -f /tmp/filepath ] && [ ! -f /tmp/samenamefilepath ] ; then
[ "$loadediso" != "" ] && [ -d /media/"${appurl}" ] && sudo mount -o loop,iocharset=utf8,"${offset}" "${isopath}" /media/"${appurl}" 2>/tmp/mounterror
fi

if [ ! -f /tmp/filepath ] && [ ! -f /tmp/samenamefilepath ] ; then
[ "$loadediso" != "" ] && [ ! -d /media/"${appurl}" ] && sudo mkdir /media/"${appurl}" && sudo mount -o loop,iocharset=utf8,"${offset}" "${isopath}" /media/"${appurl}" 2>/tmp/mounterror
#[ -s /tmp/mounterror ] && sudo rmdir /media/"${appurl}"
fi

ftet="mount: 您必须指定文件系统类型"

[ ! -f /tmp/filepath ] && [ ! -f /tmp/samenamefilepath ] && if [ -s /tmp/mounterror ] ; then
fte=`cat /tmp/mounterror`

[ "$ftet" != "$fte" ] && sudo rmdir /media/"${appurl}" && zenity --title= --text-info --filename=/tmp/mounterror && exit 0
[ "$ftet" == "$fte" ] && filetype=`zenity --title=  --entry --text=系统无法识别该文件格式,请你指定文件格式` && sudo mount -t "${filetype}" -o loop,iocharset=utf8,"${offset}" "${isopath}" /media/"${appurl}" 2> /tmp/mounterror 
[ -s /tmp/mounterror ] && sudo rmdir /media/"${appurl}" && zenity --title= --info --text=还是无法加载你选中的文件,可能系统无法支持该文件格式或文件已经损坏 && exit 0
[ ! -s /tmp/mounterror ] && zenity --title= --info --text=加载成功 && exit 0

else
zenity --title= --info --text=加载成功 && exit 0
fi
请继续测试。 :em09
上次由 photor 在 2009-01-27 16:10,总共编辑 2 次。
gududehuo
帖子: 92
注册时间: 2008-05-25 22:58

Re: 新手学shell写脚本,希望多多指教

#29

帖子 gududehuo » 2009-01-26 13:34

umount /dev/loop0.这个命令在8.10。我完全可以正常使用,
昨天把电脑系统换成8.04.2了,运行脚本也出现和你同样的错误,直接运行umount /dev/loop0,居然说没加载,郁闷 :em20 :em06
我不是用umount /media/加载点,是因为这样的话对文件夹名的处理太麻烦,我原先觉的umount /dev/loop0简单而且没有文件夹名处理的问题。
看看还的研究下。
头像
photor
论坛版主
帖子: 11004
注册时间: 2008-04-26 12:41

Re: 新手学shell写脚本,希望多多指教

#30

帖子 photor » 2009-01-26 16:35

经我测试,28楼的脚本在我的三个ubuntu系统中运行完全正常:
1. 台式机上wubi安装的8.10
2. 台式机上正常安装的8.04
3. 笔记本上wubi安装的8.04
包括路径和文件名中带空格的情况都没有问题,用起来很爽。
另外原则上这个脚本也可以用来挂载任何loop设备,不单是iso文件,实际上我试过挂载和卸载puppy linux系统自带的sfs文件(squashfs格式)完全正常。但是在上述系统2中测试,试图挂载系统1的虚拟磁盘root.disk时出错,原因是ext3格式不支持iocharset=utf8参数(mount命令很弱智,不支持的参数不知道自动忽略)。
上次由 photor 在 2009-01-27 17:37,总共编辑 1 次。
回复