Linux下編寫腳本Shell和Python的區別?

在對Linux命令的調用哪個更有效率,方便。


shell是用來進行系統管理的腳本,能力有限,多半用於自動化任務,並不是系統級的編程語言。python是系統級的編程語言,也就是說,你用python能幹你想乾的幾乎所有事情。


題主問的是調用命令,那當然是 POSIX 系 Shell 不羅嗦。如果你要個調用命令還算可以並且寫起來舒服點的語言,建議找 Ruby 去。

另外偏題去說 Shell 不是系統級編程語言的我也是醉了,我還真沒看到過沒有 Shell 能幹活的 Unix/Linux 傢伙的,就連你個 sysVinit 也得靠 shell 啊。並且你還觸碰到了 Unix 狂魔的 G 點——Shell 用戶萬能的膠水能力被丟到哪裡去了?隨便起一個 Python Shell 抓住 stdin 灌或者 /tmp 丟個文件喂,你能幹的我全都能幹(這是認真的,參見 makeself 等自解壓 shell 腳本形式)。

講 Google Style Guide 的算是靠了點譜(雖然還是丟下了調用命令這回事),問題是 Google 還不許用 C++ STL 呢你怎麼不說?Bash 這玩意,認真寫的人文件頭都 source 一組小庫的。

嗯上面三段講的是調用命令這個需求、最小依賴這個優點和語言本身不常被嚴肅使用(放著功能禁止用)這回事。

接下來的內容嚴重不友善,涉及大量打岔,請題主手動忽略。大概大家都看得出我和生意人在微博上有些觀點上的矛盾,我也承認匿名這樣黑不大好。但是這和用 Shell 開命令搞管道膠水一樣爽啊,我怎麼會放棄?

稍有常識的人都能看出,LibreWindows 冒泡排序的 shell 腳本完全不是用和 py 同一種風格寫出來的。我在這裡做了較為忠實的翻譯:

#!/bin/bash
orig=(12 5 13 8 9 65)

# paramaters[] -&> list[]
bubble(){
list=("$@")
local size=$((${#list[@]}-1)) i sorted=0 t
until ((sorted)); do
sorted=1
for ((i=0;i& list[i+1])); then
sorted=0;
t=${list[i]} list[i]=${list[i+1]} list[i+1]=$t
fi
done
done
}

bubble "${orig[@]}"
echo ${list[@]}
: &<&< _NOTES Real unix-shelly way: sorted=$(for i in ${orig[@]}; do echo $i; done | sort -g) sorted=$($sorted) echo ${sorted[@]} _NOTES

Bash 的完整版本可以使用 declare -n 創建引用類型的變數,但是 Cygwin 上的 bash 沒編譯進去我也就先不用吧。

提請閣下注意一點,數組本非古老的 Shell 所支持的,She-bang 不應調用 /bin/sh 而應使用 /bin/bash 執行。Bash 帶著鐐銬做這種拓展還要拿來說就算了,還強行醜化代碼不開高亮接著便是叫人「感受一下」,大概也是先生您在微博上常用的套路了。另外我承認論現代編程 Shell 不如 Python,也承認 WoSign/CNNIC 驗證就是比資本主義快。

啊我忘了一點,這個問題本來就是討論調用命令的,你跟我扯一般計算幹啥?

不要問我是誰,我只是個買辣條的。


shell功能底下效率低,python效率高功能強大


Shell腳本能做的,Python也能做,反之亦然。

問題看你比較喜歡哪種,你自己感受一下!

這個是bash shell腳本:

#!/bin/sh

#sorting following array

echo "please input a number list:"

read -a arr

for (( i=0 ; i&<${#arr[@]} ; i++ ))

do

for (( j=${#arr[@]} - 1 ; j&>i ; j-- ))

do

#echo $j

if [[ ${arr[j]} -lt ${arr[j-1]} ]]

then

t=${arr[j]}

arr[j]=${arr[j-1]}

arr[j-1]=$t

fi

done

done

echo "after sorting:"

echo ${arr[@]}

這是Python:

my_list = [12, 5, 13, 8, 9, 65]

def bubble(bad_list):
length = len(bad_list) - 1
sorted = False

while not sorted:
sorted = True
for i in range(length):
if bad_list[i] &> bad_list[i+1]:
sorted = False
bad_list[i], bad_list[i+1] = bad_list[i+1], bad_list[i]

bubble(my_list)
print my_list


可以參看Google code style(https://google-styleguide.googlecode.com/svn/trunk/shell.xml)里一段:

- If you find you need to use arrays for anything more than assignment of ${PIPESTATUS}, you should use Python.
- If you are writing a script that is more than 100 lines long, you should probably be writing it in Python instead. Bear in mind that scripts grow. Rewrite your script in another language early to avoid a time-consuming rewrite at a later date.

- 如果有複雜的的對象,請使用Python;

- 如果寫了超過100行的shell腳本,考慮使用Python重寫。


我想問問,既然PYTHON什麼都能幹,為什麼BIOS程序不是PYTHON寫的啊?


其實我也考慮過這個問題,我個人的回答是:

  1. 需要能讀bash,主要是歷史原因,bash存在的地方太廣泛了。
  2. 如果開發半小時內,可以用bash(當然也可以用python)。
  3. 如果開發稍微複雜一點,建議用python。
  4. 如果開發的工具希望有更多被重用,建議用python。


舉個例子,把xls文件轉成txt,這個要是用shell寫就很麻煩,用python就行


這倆不執行關鍵功能也許還行,效率不用太怎麼考慮。shell控制性,表達性都太一般,稍微複雜點用個專門的腳本吧


推薦閱讀:

現在研一,想學運維,有些疑惑求解答?
Linux數據,做/var黨,還是/opt黨,還是/usr/local黨,還是/home黨呢?
學神IT培訓怎麼樣?
聽說不會開發的運維不是好運維,一個懂點Linux命令的但沒有開發經驗的運維如何提高自己的運維能力?
請問HTML5和Linux運維工程師,哪個前景會好一點,上面兩個哪個針對零基礎培訓的學員更有發展前景?

TAG:Python | Linux | 腳本語言 | Linux運維 |