2014-07-22 260 views
0

這裏是我的myscript.sh這個bash腳本有什麼問題?

alias apt-get-update="apt-get update -qq" 
alias apt-get-install="apt-get install -f -y -qq --force-yes" 
alias yum-install="yum --quiet --nogpgcheck -y install" 

function ensure_cmd_or_install_package_apt(){ 
    local cmd=$1 
    shift 
    local pkg=$* 

    hash $cmd 2>/dev/null || (apt-get-update && apt-get-install $pkg) 
} 

當我運行sh myscript.sh我得到:

myscript.sh: 5: myscript.sh: Syntax error: "(" unexpected 

它看起來完美沒什麼問題;有任何想法嗎?

+3

運行'bash myscript.sh'修復了嗎?它可能是你的腳本在'dash'而不是'bash'中運行。如果是這樣,你可以將默認值更改爲bash,如下所示:http://superuser.com/questions/46748/how-do-i-make-bash-my-default-shell-on-ubuntu – rkyser

+0

是的@rkyser(+1) - 將其更改爲答案,我將發送綠色檢查:-) – IAmYourFaja

+0

我認爲有一種方法可以將註釋轉換爲答案,但我無法找到選項來執行此操作。所以,我只是發佈了一個新的答案:) – rkyser

回答

1

是否正在運行bash myscript.sh修復?

它可能是您的腳本運行在dash而不是bash

根據this answer你可以用下面的命令來更改它:

chsh 
1

而且一般來說,你應該在你的腳本標頭爲應用程序明確/殼要與運行腳本:

#!/bin/bash 

如果腳本需要bash-isms,那麼你應該告訴它使用bash運行。

在你的情況你是在Ubuntu(確認)和Ubuntu使用破折號作爲默認的外殼(即/ bin/sh是符號鏈接破折號)。短跑不允許:

function name() {} 

,而是隻想:

name() {} 

事實上,因爲它不是便攜式的第一種形式,應儘量避免使用。但是如果你使用函數關鍵字,不要使用parens,因爲它們不是必需的(它甚至是偶然的)。

關於設置腳本頭,有時最好使用env來查找程序(比如在ruby或perl的情況下,例如,您可能有許多ruby/perl可執行文件,但是路徑最遠的那個)是你想要運行的那個)。

#!/usr/bin/env ruby 

是要走的路。通常對於shell而言,/ bin/bash或/ bin/csh等在你的shebang中是足夠的,但從不假設:)。