2012-02-07 6 views
4

まず、これはシェルスクリプトでの最初の作業です。 ]ユーザにフォルダを作成するための名前を入力する方法(bash | shellスクリプト)?

は私がやりたいことは、ルートフォルダの名前を設定するためのダイアログボックスで、ユーザーの単純なフォルダ構造プロンプトの設定です:私は、HTMLやCSSで唯一の経験を持っています。 OS Xサービスまたはキーボードマエストロのホットキーを使ってこのシェルスクリプトを起動します。 - 変数が渡さ取得することはありませんし、ルートフォルダが作成されていない

#!/bin/sh 

echo -n "Enter the project name:" 
read -e NAME 

mkdir -p ~/Desktop/$NAME 
mkdir -p ~/Desktop/$NAME/subfolder1 
mkdir -p ~/Desktop/$NAME/subfolder2 

は明らかにいくつかのエラーがあります:

これは私がこれまでに作ってみたものです。私はまた、 "ダイアログ"を使って入力を求めるべきだと読んだが、うまくいくものを書くことができなかった。

ご協力いただき誠にありがとうございます。ありがとう。

答えて

9

echoreadコマンドの両方の作業テキストインターフェースを介して、あなたはOS Xサービスでスクリプトを実行する場合は、ノーがあります。ターミナルのようなインターフェイスなので、どちらのコマンドも役に立ちません。 (私はキーボードマエストロのことは知らないが、私はそれが似てい前提としています。)このような状況から、対話するための最も簡単な方法は、osascriptコマンド経由でAppleScriptを使用することが一般的である:

name="$(osascript -e 'Tell application "System Events" to display dialog "Enter the project name:" default answer ""' -e 'text returned of result' 2>/dev/null)" 
if [ $? -ne 0 ]; then 
    # The user pressed Cancel 
    exit 1 # exit with an error status 
elif [ -z "$name" ]; then 
    # The user left the project name blank 
    osascript -e 'Tell application "System Events" to display alert "You must enter a project name; cancelling..." as warning' 
    exit 1 # exit with an error status 
fi 

mkdir -p ~/Desktop/$name 
mkdir -p ~/Desktop/$name/subfolder1 
mkdir -p ~/Desktop/$name/subfolder2 

(注意:私が好みますPATHなどの特殊変数との競合を避けるために、シェル内の小文字の変数名を使用してください)

+0

これはすばらしいことですが、私はこれを行うよりスマートな方法があることを知っていました。 osascriptのヒントと上記の例をありがとう! – pattulus

+0

申し訳ありませんが、このコマンドの "fi"の意味は何ですか? – nullmicgo

+0

@nullmicgo: 'fi'は' if'ブロックの終わりを示します。 'if 'は' case ... esac'ブロックのように後方に綴られています。 –

1

シバンラインを#!/bin/bashに変更してみてください。 readはbashビルトインです。あなたは現在bashでスクリプトを実行していません。 /bin/shは実際には/bin/bashへのリンクかもしれませんが、Wikipediaによると、これはOS Xの特定のバージョンに依存します。

スクリプトはそのままbashで正しく動作するはずです。

+0

-eはbash拡張ですが、読み取り自体は標準です。 –

+0

2つのサブフォルダのみが作成されました。私はシェルでそれを引き起こさなかったので、私はプロンプトされなかったと思う。 – pattulus

+0

私はそれがそのように機能していることを知らなかった、私はあなたが端末でプロセスを産んでいたと思った。それについて申し訳ありません! –

0

NAMEが空であるか、$ NAMEを文字列として出力していますか?後者の場合は、〜/デスクトップ/ $(NAME)

XDialog(MacOSではツールです)を試してみてください。入力処理に使用する方法については、多くのリソースがあります。

2

私はスクリプトが対話型シェルで実行されていないと仮定しています。つまり、read -eと対話できません。

これを試すためのOSXボックスはありませんが、グラフィックのダイアログボックスではCocoaDialogを試してみることができます。

テストされていない例:そのようなスクリプトが実行されているターミナルウィンドウとして

#!/bin/bash 
NAME=`CocoaDialog standard-inputbox --title "Project Name" --no-newline --no-cancel --informative-text "Enter the project name"` 
mkdir -p ~/Desktop/$NAME/subfolder1 
mkdir -p ~/Desktop/$NAME/subfolder2 
+0

CocoaDialogの提案と、シェルから離れるときに対話ができないことを確認してくれてありがとう。 私はまだ、別のアプリケーション(話すコーディング初心者)をインストールするのではなく、オンボードのツールを使用する方が好きです。 – pattulus

2

注:@Gordon Davissonの回答は価値がありますが、ここではコードをより堅牢にするいくつかの改善点があります元の投稿を編集しますが、拒否されました)。

改善:

  • 先頭と末尾の空白を
  • 空白のみの入力を
  • 空または空白のみの入力が
に警告した後、プロンプトをユーザに返す防止される入力からトリミングされます

コード:

while :; do # Loop until valid input is entered or Cancel is pressed. 
    name=$(osascript -e 'Tell application "System Events" to display dialog "Enter the project name:" default answer ""' -e 'text returned of result' 2>/dev/null) 
    if (($?)); then exit 1; fi # Abort, if user pressed Cancel. 
    name=$(echo -n "$name" | sed 's/^ *//' | sed 's/ *$//') # Trim leading and trailing whitespace. 
    if [[ -z "$name" ]]; then 
     # The user left the project name blank. 
     osascript -e 'Tell application "System Events" to display alert "You must enter a non-blank project name; please try again." as warning' >/dev/null 
     # Continue loop to prompt again. 
    else 
     # Valid input: exit loop and continue. 
     break 
    fi 
done 
関連する問題