伊莉討論區

標題: Shell script 教學 [打印本頁]

作者: l12436    時間: 2013-4-25 03:25 PM     標題: Shell script 教學

本帖最後由 l12436 於 2013-5-3 09:37 AM 編輯

小弟來發一下shell script的教學,基本上就是linux指令的整合。
由於小弟的shell script都是要寫的時候才會想到要寫甚麼,我會慢慢發佈一些教學。
#!/bin/bash
list=$(ls -b | grep 'tar\.gz')
for file in $list
do
     echo $file
done

這個是小弟常用的程式碼片段,他可以搜尋我們需要的檔案。後面的grep是過濾結果,這次我們要尋找的檔案室tar.gz,也就是使用tar zcvf指令壓縮的檔案。類似的片段可以達到一次重複命名多個檔案。

list=$(ls -b | grep '\.package')
for file in $list
do
    mv $file "$file".bak
done

這樣可以將所有符合*.package的檔案全部重新命名。

教學2
list=$(ls -b | grep '\.package')
for file in $list
do
   if [ -f "$file" ]; then
         mv $file "$file".bak
   fi
done


增加if的判斷,防止檔案不存在也執行。


list="a.pack b.pack"
str=(${list// / })
for (( i=0;i<10;i=i+1 ))
do
        echo ${str[$i]}
done
echo ${str[$i]} 這個式比較進階的用法,shell script的array用法。
(${list// / }) 這個式把list的字串分離成多個array。

教學03


arg="$@"
argu=(${argu// / })
for (( i=0; i<${#argu[@]}; i=i+1 ))
do
  if [ -f "${argu[$i]}" ]; then
    mv "${argu[$i]}" "${argu[$i]//tar.gz/tgz}"
  fi
done
看得懂的可以先回復XD,我改天再來解釋。


作者: erobyi    時間: 2013-4-27 08:47 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: l12436    時間: 2013-4-27 09:57 PM

因為grep支援正規化表示,所以有些會不一樣。
正常來講你直接使用'\.c'就好了。

作者: l12436    時間: 2013-4-27 10:02 PM

本帖最後由 l12436 於 2013-4-27 10:20 PM 編輯

剛剛發現因為我的程式碼是手寫的,沒有測試過XDDD。所以可能會有錯XD
我把教學放在一樓好了
作者: erobyi    時間: 2013-5-3 09:16 AM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: l12436    時間: 2013-5-3 09:23 AM

本帖最後由 l12436 於 2013-5-3 09:27 AM 編輯
erobyi 發表於 2013-5-3 09:16 AM
都無關係啊。。。
明白整體的意思就好
好像都那樣寫,因為好眼熟。。。

這個其實我已經知道了==,我是用linux快4年的老手了,我的桌上型電腦已經沒有安裝windows了。所以這個部份我算是很清楚。這種grep還算式基礎指令了XD
不過其實我看不懂你再做什麼,前兩個我知道,第3個不清楚XD

egrep或許好用,但是我覺得我我會等到grep不能用了才會打算使用他。

因為正規表達式我剛好會,所以grep對我來講究很好用了XD

作者: erobyi    時間: 2013-5-3 11:46 AM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: l12436    時間: 2013-5-3 09:02 PM

erobyi 發表於 2013-5-3 11:46 AM
這不是egrep,這就是grep啊,basic 的grep(grep-G)
在下不是用egrep。。。

哈,基本上我不太會用他的進階功能,因為到目前為止我寫的script還沒需要用到他。
作者: sleepless-man    時間: 2013-5-11 09:23 AM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: ardisia    時間: 2013-5-27 03:17 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: l12436    時間: 2013-5-27 09:59 PM

ardisia 發表於 2013-5-27 03:17 PM
大概就是以下幾個的組合

getopts

是,不過我的都是用基礎指令堆起來了,當然,只有了解基礎的shell不夠,我後來寫的程式只了解基礎很難實作出我要的程式。
作者: l12436    時間: 2013-6-25 11:09 PM

最近多完了一個東西
adduser='
        <window title="input argument" window_position="1" default_height="320" default_width="480">
                <vbox>
                        <text>
                                <label>argument</label>
                        </text>
                        <entry>
                                <variable>argument</variable>
                        </entry>
                        <hbox>
                                <button ok></button>
                        </hbox>
                </vbox>
        </window>
        '
        export adduser
        gtkdialog --program adduser

這樣的程式碼可以很簡單的從shell顯示一個簡單的視窗出現,前題是有安裝gtkdialog。
作者: 阿爾托利亞saber    時間: 2013-6-26 12:01 AM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: erobyii    時間: 2013-6-28 10:24 AM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: l12436    時間: 2013-6-28 08:13 PM

erobyii 發表於 2013-6-28 10:24 AM
教學03

1.有,把${argu// / }改成${arg// / },因為程式是手打的,沒有測試。
2.那個單純只是擷取所有的參數,可以使用for list in $@去讀取。
3.那個進階使用的取代方法
4.那個shell的陣列大小計算方法,基本上#這個只是根他講說要算整個array的大小,也就是有有存內容的數量。
5.他是array。
基本上我會講array,不會講數組。
作者: l12436    時間: 2013-11-11 02:59 PM

分享,之前寫的image下載。
因為是寫給自己用的,所以功能沒有很多。

http://www.mediafire.com/download/z5skqdxqb2s66np/image_down

作者: loke0205    時間: 2013-11-30 01:32 AM

挖 shell 耶 謝謝大大分享 我剛好想知道相關知識
順便問一下大大 你參考的書籍OR資料是?
作者: l12436    時間: 2013-12-2 12:29 PM

loke0205 發表於 2013-11-30 01:32 AM
挖 shell 耶 謝謝大大分享 我剛好想知道相關知識
順便問一下大大 你參考的書籍OR資料是? ...

基本上都是內建的說明和鳥哥的資訊,其他一些進階的資訊都是google來的。
作者: rtmju82    時間: 2013-12-15 10:41 AM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: mihaw    時間: 2014-2-20 06:44 AM

目前正在學習中
以前Windows用習慣了
現在學習用指令,真的要慢慢熟悉
大大實在太厲害了!
作者: loke0205    時間: 2014-2-22 05:34 PM

l12436 發表於 2013-12-2 12:29 PM
基本上都是內建的說明和鳥哥的資訊,其他一些進階的資訊都是google來的。 ...

謝謝大大分享,鳥哥好像沒有交的很詳細 除了鳥哥以外你知道有其他地方有資料嗎???...我google的 都是零零星星的資料 有沒比較完整的
作者: l12436    時間: 2014-6-11 11:20 PM

本帖最後由 l12436 於 2014-6-11 11:21 PM 編輯

sum of subset bash版
  1. #!/bin/bash

  2. nums="2 10 13 17 22 42 14 3 15 10 25 65 67 100 67"
  3. # nums="2 10 13 17 22 42"
  4. ans=""
  5. weight=65
  6. # weight=52
  7. numlist=(${nums// / })
  8. length=${#numlist[@]}

  9. function test() {
  10.         if [ "$1" -gt 0 ]; then
  11.                 for i in $(seq $2 $(($length - 1))  )
  12.                 do
  13.                         tmp=${numlist[$i]}
  14.                         ans+="$tmp "
  15.                         test "$(( $1 - $tmp ))" "$(( $i + 1 ))"
  16.                         
  17.                         anslist=(${ans// / })
  18.                         anslength=${#anslist[@]}
  19.                         anstmp=$(( $anslength - 1 ))
  20.                         if [ "$anstmp" -ge 0  ]; then
  21.                                 removenum=${anslist[ $anstmp ]}
  22.                                 ans=${ans/%$removenum }
  23.                         fi
  24.                 done
  25.         elif [ "$1" -eq 0 ]; then
  26.                 echo $ans
  27.         fi
  28. }

  29. function removeGreater()  {
  30.         for i in $(seq 0 $(($length - 1))  )
  31.         do
  32.                 tmp=${numlist[$i]}
  33.                 if [ "$tmp" -gt "$1" ]; then
  34.                         if [ -z "$(echo $greater | grep $tmp)" ]; then
  35.                                 greater+="$tmp "
  36.                                 nums=${nums//$tmp/}
  37.                         fi
  38.                 fi
  39.         done
  40.         numlist=(${nums// / })
  41.         length=${#numlist[@]}
  42.         greater=${greater/%\ }
  43.         echo "${greater//\ /
  44. \n'}"
  45. }

  46. removeGreater $weight
  47. test $weight 0
複製代碼


作者: alleluia001    時間: 2014-7-3 08:28 AM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: l12436    時間: 2018-12-13 11:55 AM

alleluia001 發表於 2014-7-3 08:28 AM
shell script 很強大,最近但卻改用python來寫 XD

是看過滿多人這樣用的,我個人是除非用到python的函式庫,不然不太會用python取代shell script。
看python一堆字串相街有點醜XD
作者: l12436    時間: 2018-12-13 12:00 PM

本帖最後由 l12436 於 2018-12-13 12:03 PM 編輯

Script分享
最近開始使用docker,為了在docker上面使用GUI,做了一個script專門為了執行docker,還帶一些彈性的function讓我可以額外再其他地方擴充。
  1. #!/bin/bash

  2. if [ -f "$HOME/shm/.debug" ]; then
  3.         exec >~/shm/debug-docker-utils 2>&1
  4. fi

  5. help() {
  6.         echo "$0 <start|stop|run|clean|do-init|update <container>>"
  7. }

  8. function image-opt() {
  9.         case $image in
  10.                 wine|wine:*)
  11.                         if [ -z "$(echo "$image" | grep 'creepy')" ]; then
  12.                                 args+="
  13.                                 -v /data:/data
  14.                                 -v /swap:/swap
  15.                                 -v /movie:/movie
  16.                                 -v /download:/download
  17.                                 -v $HOME/winedlls:$HOME/winedlls
  18.                                 -v $HOME/Software/Documents:$HOME/Software/Documents
  19.                                 $(mountHomeDir)
  20.                                 "
  21.                         else
  22.                                 args+="
  23.                                 -v $HOME/文宣:$HOME/文宣:ro
  24.                                 -v /data:/data:ro
  25.                                 -v /swap:/swap:ro
  26.                                 -v /movie:/movie:ro
  27.                                 -v /download:/download:ro
  28.                                 -v /data/game/creepypasta:/data/game/creepypasta:rw
  29.                                 -v /data/game/IndieGame:/data/game/IndieGame:rw
  30.                                 "
  31.                                 workdir=/data/game/creepypasta
  32.                                 XMODIFIERS=""
  33.                                 IME=""
  34.                         fi
  35.                         args+="
  36.                         -v $HOME/.local/share/wine-cache/etc:/etc
  37.                         -v $HOME/Shell/Launcher/WINE:/usr/local/bin/WINE
  38.                         -v $HOME/.config/Trolltech.conf:$HOME/.config/Trolltech.conf:ro
  39.                         -v $HOME/.config/gtk-3.0/:$HOME/.config/gtk-3.0:ro
  40.                         -v $HOME/.gtkrc-2.0:$HOME/.gtkrc-2.0:ro
  41.                         -v $HOME/.PlayOnLinux/wine:$HOME/.PlayOnLinux/wine/
  42.                         $(ConvPath \
  43.                                 $(ls -1 /usr/share/nvidia* -d 2>/dev/null)\
  44.                                 $(ls -1 \
  45.                                 /usr/lib/*nvidia*so* \
  46.                                 /usr/lib/x86_64-linux-gnu/*nvidia*so* \
  47.                                 /usr/lib/x86_64-linux-gnu/libcuda* \
  48.                                 /usr/lib/i386-linux-gnu/*nvidia*so* \
  49.                                 /usr/lib/i386-linux-gnu/libcuda* \
  50.                                 /etc/ld.so.conf.d/x86_64-linux-gnu*GL* \
  51.                                 /etc/ld.so.conf.d/i386-linux-gnu*GL* \
  52.                                 /usr/share/glvnd/egl_vendor.d/*nvidia*.json \
  53.                                 /usr/lib/x86_64-linux-gnu/xorg/nvidia_drv.so \
  54.                                 /usr/share/X11/xorg.conf.d/10-nvidia.conf\
  55.                                 /usr/lib/x86_64-linux-gnu/libXNVCtrl.so*\
  56.                                 /usr/lib/i386-linux-gnu/libXNVCtrl.so*\
  57.                                 /usr/lib/x86_64-linux-gnu/libnvcuvid.so*\
  58.                                 /usr/lib/i386-linux-gnu/libnvcuvid.so*\
  59.                                 /usr/lib/x86_64-linux-gnu/libnvoptix.so*\
  60.                                 /usr/lib/x86_64-linux-gnu/vdpau/libvdpau_nvidia.so*\
  61.                                 /usr/lib/i386-linux-gnu/vdpau/libvdpau_nvidia.so*\
  62.                                 /usr/lib/x86_64-linux-gnu/tls/libnvidia-tls.so*\
  63.                                 /usr/lib/x86_64-linux-gnu/xorg/libglxserver_nvidia.so*\
  64.                                 /usr/lib/i386-linux-gnu/tls/libnvidia-tls.so*\
  65.                                 2>/dev/null)\
  66.                         )
  67.                         $(ls -1 /usr/lib*/nvidia*/libGL.so 2>/dev/null | sed -rn 's/(.*)\/libGL.so/-v \1:\1:ro/gp')
  68.                         --privileged
  69.                         "
  70.                         if [ "$FASTWINE" == "1" ]; then
  71.                                 args+=" -v $HOME/.PlayOnLinux/wine/linux-amd64/2.6-staging:/opt/wine-staging"
  72.                         else
  73.                                 args+=" -v /opt/wine-staging:/opt/wine-staging"
  74.                         fi
  75.                         if [ "$GUI" != "1" ]; then
  76.                                 args+="$(getGuiArg)"
  77.                         fi
  78.                         Locale="zh_TW.UTF-8"
  79.                         ;;
  80.                 jenkins*)
  81.                         args+="
  82.                         -v /var/run/docker.sock:/var/run/docker.sock
  83.                         -v /movie/root/jenkins:/var/lib/jenkins
  84.                         -v /ssd/docker:/var/lib/docker
  85.                         --name=jenkins"
  86.                         [ -z "$(netstat -atn | egrep '8082 *:::')" ] && args+=" -p 8082:8080"
  87.                         ;;
  88.                 minecraft)
  89.                         args+="
  90.                         -v /movie/Eclipse/workspace-bukkit/bukkit:/movie/Eclipse/workspace-bukkit/bukkit:ro
  91.                         -v /swap/game/Linux:$HOME/game/server
  92.                         -e 'SHELL=/bin/bash'
  93.                         --name=server"
  94.                         workdir="$HOME/game/server"
  95.                         [ -z "$(ss -atn | egrep '25568 *:::')" ] && args+=" -p 25568:36679"
  96.                         if [ -z "$(ss -atn | egrep '255[5-8][0-9] *:::')" ]; then
  97.                                 args+="
  98.                                 -p 25558:25558
  99.                                 -p 25562-25566:25562-25566
  100.                                 -p 25666-25668:25666-25668
  101.                                 -p 25577:25577
  102.                                 "
  103.                         fi
  104.                         [ -z "$(ss -atn | egrep '12299 *:::')" ] && args+=" -p 12299:12299"
  105.                         ;;
  106.         esac
  107. }

  108. function run-parser() {
  109.         while [ ! -z "$1" ]
  110.         do
  111.                 case $1 in
  112.                         -nr)
  113.                                 defaultRemove=0
  114.                                 ;;
  115.                         -d)
  116.                                 interactive=0
  117.                                 daemon=1
  118.                                 args+=" -dt"
  119.                                 ;;
  120.                         -n)
  121.                                 interactive=0
  122.                                 ;;
  123.                         --wine-staging)
  124.                                 cmd="$HOME/Shell/bin/wine-source staging"
  125.                                 ;;
  126.                         --wine)
  127.                                 cmd=$HOME/Shell/bin/wine-source
  128.                                 ;;
  129.                         -g)
  130.                                 args+="$(getGuiArg)"
  131.                                 GUI=1
  132.                                 ;;
  133.                         -c)
  134.                                 shift
  135.                                 cmd="$1"
  136.                                 ;;
  137.                         -cn)
  138.                                 shift
  139.                                 container="$1"
  140.                                 ;;
  141.                         -u)
  142.                                 shift
  143.                                 user=$1
  144.                                 ;;
  145.                         --help)
  146.                                 echo "$0 run [--wine|--wine-staging|-r|-n|-nr|-d|-g|-c <cmd>|-u <user>|-cn <name>] <image> [args for docker]"
  147.                                 exit 0
  148.                                 ;;
  149.                         -v)
  150.                                 shift
  151.                                 args+=" -v \"${1// /\\ }\""
  152.                                 ;;
  153.                         *)
  154.                                 [ -z "$image" ] && image=$1 || args+=" $1"
  155.                                 ;;
  156.                 esac
  157.                 shift
  158.         done

  159.         if [ "$interactive" == "1" ]; then
  160.                 args+=" -i"
  161.                 if [ -t 1 ]; then
  162.                         args+=" -t"
  163.                 fi
  164.         fi
  165.         [ "$defaultRemove" == "1" ] && args+=" --rm"
  166.         if [ -z "$image" ]; then
  167.                 docker images && \
  168.                 read -p "image name > " image || exit
  169.         fi
  170.         container=${container:-$image}
  171.         args+="
  172.         -v $HOME/.gitconfig:$HOME/.gitconfig
  173.         "
  174. }

  175. function run() {
  176.         interactive=1
  177.         defaultRemove=1
  178.         daemon=0
  179.         user=otakux
  180.         workdir=~
  181.         run-parser "$@"

  182.         image-opt

  183.         if [ ! -z "$(type extra-config 2>/dev/null)" ]; then
  184.                 extra-config
  185.         fi

  186.         if [ "$daemon" == "1" -a "$cmd" != "/bin/bash --login" ]; then
  187.                 cmdbak="$cmd"
  188.                 cmd="/bin/bash --login"
  189.         fi
  190.         eval "/usr/bin/docker" run\
  191.         -u $user\
  192.         -v $shell:$HOME/Shell\
  193.         -v $sourcedir:$sourcedir\
  194.         -v $repo:$repo\
  195.         -v $ccache:$HOME/.ccache\
  196.         -v $shm:$shm\
  197.         -v $HOME/.config/user-dirs.dirs:$HOME/.config/user-dirs.dirs:ro\
  198.         -w $workdir\
  199.         -e LANGUAGE=$Locale\
  200.         -e LANG=$Locale\
  201.         -e LC_ALL=$Locale\
  202.         -e XMODIFIERS=$XMODIFIERS\
  203.         -e GTK_IM_MODULE=$IME\
  204.         -e QT4_IM_MODULE=$IME\
  205.         -e QT_IM_MODULE=$IME\
  206.         -e QT_QPA_PLATFORMTHEME=kde\
  207.         -e USER=$USER\
  208.         -e WINEDEBUG=-all\
  209.         -e DOCKER=1\
  210.         $args\
  211.         $image "$cmd"
  212.         if [ "$daemon" == "1" -a ! -z "$cmdbak" ]; then
  213.                 eval /usr/bin/docker exec -u $user $container "$cmdbak"
  214.         fi
  215. }

  216. clean() {
  217.         docker system prune
  218.         if [ "$?" == "0" ]; then
  219.                 return 0
  220.         fi
  221.         cleanList="dead"
  222.         while [ ! -z "$1" ]; do
  223.                 case $1 in
  224.                         -i)
  225.                                 interactive=y
  226.                                 ;;
  227.                         --no-created)
  228.                                 cleanList="${cleanList//created}"
  229.                                 ;;
  230.                         -h)
  231.                                 echo "$0 clean [-i|--no-created]"
  232.                                 exit
  233.                                 ;;
  234.                         *)
  235.                                 break
  236.                                 ;;
  237.                 esac
  238.                 shift
  239.         done
  240.         for status in $cleanList
  241.         do
  242.                 list=$(docker ps --filter status=$status --filter status=exited -aq)
  243.                 [ -z "$list" ] && {
  244.                         echo no $status container exists
  245.                         continue
  246.                 }
  247.                 echo ${status} list $(docker ps --filter status=$status --filter status=exited -aq)
  248.                 [ -z "$interactive" ] && ask=y || read -p "clean $status container ? > " ask
  249.                 [ ! -z "$ask" ] && docker ps --filter status=$status --filter status=exited -aq | xargs docker rm -v
  250.                 unset ask list
  251.         done
  252.         
  253.         [ -z "$interactive" ] && ask=y || read -p "remove untagged image ? > " ask
  254.         if [ ! -z "$ask" ]; then
  255.                 echo remove untagged image
  256.                 list=$(docker images --no-trunc | grep '<none>' | awk '{ print $3 }')
  257.                 [ ! -z "$list" ] && docker images --no-trunc | grep '<none>' | awk '{ print $3 }' | xargs -r docker rmi
  258.                 unset ask
  259.         fi
  260.         [ -z "$interactive" ] && ask=y || read -p "remove dangling volume ? > " ask
  261.         if [ ! -z "$ask" ]; then
  262.                 echo remove dangling volume
  263.                 list=$(docker volume ls -qf dangling=true)
  264.                 [ ! -z "$list" ] && docker volume rm $list
  265.                 unset ask
  266.         fi
  267. }

  268. function do-init() {
  269.         container=$1
  270.         if [ -z "$container" ]; then
  271.                 return 0
  272.         fi
  273.         docker exec -it $container apt update || return 0
  274.         docker exec -it $container apt install fonts-wqy-zenhei fonts-wqy-microhei xauth command-not-found iputils-ping lsof net-tools wget software-properties-common psmisc sudo vim curl bash-completion openssh-client rsync fakeroot git apt-transport-https openssh-server
  275.         docker exec -it $container adduser otakux
  276.         docker exec -it $container usermod -G 4,6,24,27,30,46 -a -p U6aMy0wojraho otakux
  277.         docker exec -it $container find /etc/apt/apt.conf.d/ -name '*docker*' -exec rm '{}' \;
  278.         docker exec -it $container sed -ri 's/PermitEmptyPasswords no/PermitEmptyPasswords yes/g'  /etc/ssh/sshd_config
  279. }

  280. function getGuiArg() {
  281.         local guiArgs tmpdisplay pulsenative pulsedir pidfile isPidExist
  282.         for file in $(ls -1 /tmp/pulse*/native 2>/dev/null) $XDG_RUNTIME_DIR/pulse/native /run/user/$(id -u)/pulse/native
  283.         do
  284.                 pidfile="${file%/*}/pid"
  285.                 if [ ! -f "$pidfile" ]; then
  286.                         continue
  287.                 fi
  288.                 pid=$(cat $pidfile)
  289.                 isPidExist=$(ps -p $pid | tail -n+2)
  290.                 if [ -e "$file" -a ! -z "$isPidExist" ]; then
  291.                         pulsenative=$file
  292.                         pulsedir=${file%/*}
  293.                         guiArgs+=" -v $pulsedir:$pulsedir"
  294.                         break
  295.                 fi
  296.         done
  297.         if [ ! -z "$(DISPLAY=":0" xrandr 2>/dev/null)" ]; then
  298.                 guiArgs+="
  299.                 -e DISPLAY=${DISPLAY:-:0}
  300.                 "
  301.         else
  302.                 guiArgs+="
  303.                 -e DISPLAY=${DISPLAY:-:1}
  304.                 -e WAYLAND_DISPLAY=${WAYLAND_DISPLAY:-wayland-0}
  305.                 "
  306.         fi
  307.         guiArgs+="
  308.         -v /tmp/.X11-unix:/tmp/.X11-unix:ro
  309.         -v /dev/dri:/dev/dri
  310.         --device=/dev/snd:/dev/snd
  311.         -e PULSE_SERVER=unix:$pulsenative
  312.         --group-add $(getent group audio | cut -d ':' -f3)
  313.         -v /dev/shm:/dev/shm
  314.         -v $HOME/.asoundrc:$HOME/.asoundrc
  315.         --device=/dev/nvidia0
  316.         --device=/dev/nvidiactl
  317.         --device=/dev/nvidia-modeset
  318.         --device=/dev/nvidia-uvm
  319.         --ipc=host
  320.         "

  321.         if [ -e "/dev/nvidia-uvm-tools" ]; then
  322.                 guiArgs+=" --device=/dev/nvidia-uvm-tools"
  323.         fi
  324.         echo "$guiArgs"
  325. }

  326. function mountHomeDir() {
  327.         local list="flash game image music Packfile Software Text winedlls"
  328.         local homeArgs
  329.         for dir in $list
  330.         do
  331.                 homeArgs+=" -v $HOME/$dir:$HOME/$dir"
  332.         done

  333.         echo "$homeArgs"
  334. }

  335. function ConvPath() {
  336.         local parg=

  337.         for path in $@
  338.         do
  339.                 if [ -e "$path" ]; then
  340.                         pargs+=" -v $path:$path:ro"
  341.                 fi
  342.         done
  343.         
  344.         echo "$pargs"
  345. }

  346. sourcedir="/swap/Programing/Source/"
  347. repo="/repo"
  348. ccache="/ssd/ccache"
  349. shell="$HOME/Shell"
  350. shm="$HOME/shm"
  351. cmd=${cmd:-"/bin/bash --login"}
  352. image=${image}
  353. Locale="C.UTF-8"
  354. IME="gcin"
  355. XMODIFIERS=${XMODIFIERS:-"@im=$IME"}

  356. while true
  357. do
  358.         case $1 in
  359.                 init)
  360.                         cat << EOF
  361. apt install command-not-found iputils-ping lsof net-tools wget software-properties-common psmisc sudo vim curl bash-completion openssh-client rsync fakeroot git apt-transport-https
  362. yum install lsof net-tools wget psmisc sudo vim curl bash-completion openssh rsync fakeroot git
  363. sed -r 's/^mirrorlist/#mirrorlist/g;s/^#baseurl/baseurl/g;s/mirror.centos.org\/centos\/\\\$releasever/vault.centos.org\/5.10/g'

  364. # need for X11 forwarding
  365. apt install fonts-wqy-zenhei fonts-wqy-microhei xauth fonts-arphic-ukai fonts-arphic-uming

  366. # wine hidden dependency
  367. apt install winbind libpng12
  368. EOF
  369.                         break
  370.                         ;;
  371.                 do-init)
  372.                         shift
  373.                         do-init "$1"
  374.                         break
  375.                         ;;
  376.                 update)
  377.                         shift
  378.                         cname=$1
  379.                         shift
  380.                         image=$1
  381.                         shift
  382.                         case $cname in
  383.                                 -h|--help)
  384.                                 cat << EOF
  385. ${0##*/} update <container hash> <image>
  386.         export container as image.
  387.         use for constant update build image
  388.         Goal is to keep image size small.
  389. EOF
  390.                                         exit 0
  391.                                         ;;
  392.                         esac
  393.                         if [ -z "$cname" -o -z "$image" ]; then
  394.                                 exit 1
  395.                         fi
  396.                         iname=${image//:/-}
  397.                         if [ ! -d "${BACKDIR:-/download/docker-backup}" ]; then
  398.                                 mkdir -p ${BACKDIR:-/download/docker-backup}
  399.                         fi
  400.                         cd ${BACKDIR:-/download/docker-backup} &&\
  401.                         echo "exporting $cname to $iname.tar" &&\
  402.                         docker export $cname > $iname.tar &&\
  403.                         echo "import $iname.tar as $image" &&\
  404.                         docker import $iname.tar $image &&\
  405.                         rm $iname.tar
  406.                         exit 0
  407.                         ;;
  408.                 run)
  409.                         shift
  410.                         run "$@"
  411.                         break
  412.                         ;;
  413.                 clean)
  414.                         clean
  415.                         break
  416.                         ;;
  417.                 exec)
  418.                         shift
  419.                         while true
  420.                         do
  421.                                 case $1 in
  422.                                         -c)
  423.                                                 shift
  424.                                                 cmd="$1"
  425.                                                 ;;
  426.                                         *)
  427.                                                 if [ -z "$image" ]; then
  428.                                                         image="$1"
  429.                                                 else
  430.                                                         args+=" $1"
  431.                                                 fi
  432.                                                 ;;
  433.                                 esac
  434.                                 shift
  435.                                 [ -z "$1" ] && break
  436.                         done
  437.                         /usr/bin/docker exec $args $image bash -c "$cmd"
  438.                         break
  439.                         ;;
  440.                 -j*|-n)
  441.                         ;;
  442.                 "")
  443.                         help
  444.                         break
  445.                         ;;
  446.                 *)
  447.                         /usr/bin/docker "$@"
  448.                         break
  449.                         ;;
  450.         esac
  451.         shift
  452.         [ -z "$1" ] && break
  453. done
複製代碼

作者: l12436    時間: 2018-12-13 12:02 PM

Script 分享,利用kde的kdialog顯示選項,並且根據選擇的選項執行wine
  1. #!/bin/bash

  2. function SelectCon() {
  3.         list=$(docker ps --format "table {{.Names}}" | tail -n+2)
  4.         local args
  5.         for i in $list
  6.         do
  7.                 args+=" $i $i 0"
  8.         done
  9.         name=$(kdialog --radiolist SelectContainer $args)
  10.         if [ "$name" == "" ]; then
  11.                 return
  12.         fi
  13.         export DOCKERNAME=$name
  14. }

  15. function WINEENV() {
  16. #         if [ -e "/swap/.gamewine" ]; then
  17. #                 local defaultdir="/swap/.gamewine"
  18. #         elif [ -d "/swap/.wine" ]; then
  19. #                 local defaultdir="/swap/.wine"
  20. #         elif [ -d "$HOME/.wine" ]; then
  21. #                 local defaultdir="$HOME/.wine"
  22. #         fi
  23.         for i in $(ls -d /swap/wine/*)
  24.         do
  25.                 args+=" $i ${i##*/} 0"
  26.         done
  27.         result=$(kdialog --radiolist WineEnv $args)
  28. #         result=$(kdialog $args --getexistingdirectory $defaultdir )
  29.         if [ "$?" -eq 0 ]; then
  30.                 export WINEPREFIX="$result"
  31.         else
  32.                 exit
  33.         fi
  34. }

  35. function SelectProgram() {
  36.         list=$(cat /home/otakux/Shell/Launcher/wineprog.conf)
  37.         for file in $list
  38.         do
  39.                 arglist+=" $file $file"
  40.         done
  41.         program=$(kdialog $args --menu "Select Program" $arglist)
  42.        
  43.         if [ "$?" -ne 0 ]; then
  44.                 exit
  45.         fi
  46. }

  47. function parseArgs() {
  48.         pargs=""
  49. #         skip first which always program path
  50.         shift
  51.         while true
  52.         do
  53.                 case $1 in
  54.                         esync)
  55.                                 result+="esync "
  56.                                 WINEESYNC=1
  57.                                 ;;
  58.                         dmime)
  59.                                 result+="DMIME "
  60.                                 ;;
  61.                         desktop)
  62.                                 result+="Desktop "
  63.                                 ;;
  64.                         staging)
  65.                                 result+="CSMT "
  66.                                 ;;
  67.                         docker)
  68.                                 if [ "$NODOCKER" != "1" ]; then
  69.                                         result+="DOCKER "
  70.                                 fi
  71.                                 ;;
  72.                         selectenv*)
  73.                                 if [ "$NODOCKER" != "1" -a -z "${1#*=}" ]; then
  74.                                         result+="SelectEnv "
  75.                                 else
  76.                                         WINEPREFIX=${1#*=}
  77.                                 fi
  78.                                 ;;
  79.                         lang=*)
  80.                                 case ${1##*=} in
  81.                                         jp|JP)
  82.                                                 language="ja_JP.UTF-8"
  83.                                                 ;;
  84.                                         cn|CN)
  85.                                                 language="zh_CN.UTF-8"
  86.                                                 ;;
  87.                                 esac
  88.                                 ;;
  89.                         glsl-disable)
  90.                                 winetricks glsl=disabled
  91.                                 ;;
  92.                         -h|--help)
  93.                                 cat << EOF
  94. ${0##*/} [desktop|staging|glsl-disable|docker|selectenv[=<path>]|lang=<jp|cn>|dmime]
  95.         docker,selectenv
  96.                 only for host.
  97. EOF
  98.                                 exit 0
  99.                                 ;;
  100.                         DOCKER)
  101.                                 ;;
  102.                         *)
  103.                                 pargs+=" \"$1\""
  104.                                 ;;
  105.                 esac
  106.                 shift
  107.                 [ -z "$1" ] && break
  108.         done
  109. }

  110. function checkArgs() {
  111.         string="$1"
  112.         shift
  113.         echo "$*" | grep "$string"
  114. }

  115. if [ -f "$HOME/shm/.debug" ]; then
  116.         exec >~/shm/debug-wine 2>&1
  117. fi

  118. WINEESYNC=0
  119. WITHDESKTOP=0
  120. DEROX=0
  121. DOCKER=0
  122. NODOCKER=${NODOCKER:-0}
  123. args=""

  124. parseArgs "$@"

  125. if [ "$NODOCKER" != "1" -a -z "$result" ]; then
  126.         option='
  127.         Desktop                "With Desktop"                off
  128.         '
  129.         [ "$NODOCKER" -eq 0 ] &&\
  130.                 option+='
  131.                 DOCKER                "Run in Docker"                off
  132.                 SelectEnv        "Select Wine Prefix"        off
  133.                 SelectCon        "Select Container"                off
  134.                 '
  135.         option+='
  136.         CSMT                "Using Wine Staging"        off
  137.         esync                "Using Esync"                        off
  138.         DMIME                "Fix Micwave error"                off
  139.         '
  140.         [ "$NODOCKER" -eq 0 ] &&\
  141.                 option+='
  142.                 DeRoX                "Load in DeRoX"                off
  143.                 SelectProg        "Select Program"        off
  144.                 '
  145.         option+='
  146.         zh_CN.utf8         "LANG=CN"        off
  147.         ja_JP.utf8         "LANG=JP"        off
  148.         '
  149.         result=$(eval "kdialog $args --separate-output --checklist ExtendedWineStarter \
  150.         "$option""
  151.         )

  152.         if [ "$?" -ne 0 ]; then
  153.                 exit
  154.         fi
  155. fi

  156. for str in $result
  157. do
  158.         case $str in
  159.                 esync)
  160.                         WINEESYNC=1
  161.                         [ -z "$(checkArgs "$str" "$*")" ] && dockerargs+=" $str"
  162.                         ;;
  163.                 DMIME)
  164.                         export WINEDLLOVERRIDES="dmime=n,b"
  165.                         [ -z "$(checkArgs "dmime" "$*")" ] && dockerargs+=" dmime"
  166.                         ;;
  167.                 Desktop)
  168.                         WITHDESKTOP=1
  169.                         [ -z "$(checkArgs "desktop" "$*")" ] && dockerargs+=" desktop"
  170.                         ;;
  171.                 DeRoX)
  172.                         DEROX=1
  173.                         ;;
  174.                 CSMT)
  175.                         source $HOME/Shell/bin/wineenv /opt/wine-staging
  176.                         [ -z "$(checkArgs "staging" "$*")" ] && dockerargs+=" staging"
  177.                         ;;
  178.                 DOCKER)
  179.                         if [ "$NODOCKER" != "1" ]; then
  180.                                 DOCKER=1
  181.                         else
  182.                                 true
  183.                         fi
  184.                         ;;
  185.                 SelectCon)
  186.                         DOCKER=1
  187.                         SelectCon
  188.                         if [ -z "$DOCKERNAME" ]; then
  189.                                 exit
  190.                         fi
  191.                         ;;
  192.                 SelectEnv)
  193.                         WINEENV
  194.                         ;;
  195.                 SelectProg)
  196.                         SelectProgram
  197.                         ;;
  198.                 *utf8)
  199.                         language="$str"
  200.                         ;;
  201.         esac
  202. done

  203. if [ "$DOCKER" -eq 1 ]; then
  204.         export WINEPREFIX
  205.         $HOME/Shell/Launcher/docker-wine "$@" $dockerargs
  206.         exit
  207. fi

  208. if [ ! -z "$language" ]; then
  209.         export LANG="$language" LC_ALL="$language"
  210. fi
  211. if [ -z "$program" ]; then
  212.         program="$1"
  213.         shift
  214.         dir="${program%/*}"
  215.         pwd
  216.         programname="${program##*/}"
  217.         if [ "$dir" != "$program" ]; then
  218.                 cd "$dir"
  219.         fi
  220. fi
  221. if [ "$WITHDESKTOP" -eq 1 ];then
  222.         DESKTOP="explorer /desktop=$(echo "$programname" | sed -r '1,$s/.exe$//g;1,$s/\ //g;1,$s/\\.//g'),$(xdpyinfo  | sed -n 's/^ *dimensions: *\([0-9]\+x[0-9]\+\).*/\1/gp')"
  223. fi
  224. test "$DEROX" -eq 1 && DESKTOP="/home/otakux/Software/OllyDBG/odbg2/DeRoX.exe"

  225. if [ "$#" -lt 1 ]; then
  226.         pargs="$@"
  227. fi

  228. wine $DESKTOP "./$programname" $pargs
複製代碼





歡迎光臨 伊莉討論區 (https://attach1201.eyny.com/) Powered by Discuz!