13

私はbashを初めて使用しますが、次のようなbashスクリプトを作成しようとしています。

write_to_file()
{
 #check if file exists
 # if not create the file
 # else open the file to edit
 # go in a while loop
 # ask input from user 
 # write to the end of the file
 # until user types  ":q"

 }

誰かが文献を指摘することができれば、私は非常に感謝しますありがとう

4

4 に答える 4

25

更新: これは bash の質問なので、まずこれを試してください。;)

cat <<':q' >> test.file

何が起こっているのかを理解するには、bash のIO リダイレクションヒアドキュメント構文、およびcatコマンドについて読んでください。


上記のように、それを行うには多くの方法があります。さらにいくつかのbashコマンドを説明するために、あなたが要求した方法でも関数を準備しました:

#!/bin/bash

write_to_file()
{

     # initialize a local var
     local file="test.file"

     # check if file exists. this is not required as echo >> would 
     # would create it any way. but for this example I've added it for you
     # -f checks if a file exists. The ! operator negates the result
     if [ ! -f "$file" ] ; then
         # if not create the file
         touch "$file"
     fi

     # "open the file to edit" ... not required. echo will do

     # go in a while loop
     while true ; do
        # ask input from user. read will store the 
        # line buffered user input in the var $user_input
        # line buffered means that read returns if the user
        # presses return
        read user_input

        # until user types  ":q" ... using the == operator
        if [ "$user_input" = ":q" ] ; then
            return # return from function
        fi

        # write to the end of the file. if the file 
        # not already exists it will be created
        echo "$user_input" >> "$file"
     done
 }

# execute it
write_to_file
于 2013-01-31T23:54:19.167 に答える
6

基本的な引数チェックの例:

write_to_file()
{
    while [ "$line" != ":q" ]; do
        read line
        if [ "$line" != ":q" ]; then
            printf "%s\n" "$line" >> "$1"
        fi  
    done
}

if [ "$#" -eq 1 ]; then
    write_to_file "$1"
else
    echo "Usage: $0 FILENAME"
    exit 2
fi

または、おそらくあまり知られていないuntilコンストラクトを使用して、関数をもう少し簡潔に書くことができます。

# append to file ($1) user supplied lines until `:q` is entered
write_to_file()
{
    until read line && [ "$line" = ":q" ]; do
        printf "%s\n" "$line" >> "$1"
    done
}
于 2013-01-31T23:57:59.550 に答える
2

この簡単な例で開始する必要があります。

while true
do
    read INPUT
    if [[ "${INPUT}" == :q ]]
    then
        return
    fi
    echo "${INPUT}" >> file
done
于 2013-01-31T23:52:16.917 に答える
2

ここには、あまりにもうまく機能しているいくつかのソリューションがあります。ただ行う:

write_to_file() { sed '/^:q$/q' | sed '$d' >>"$1"; }

ここで、最初の引数はファイルの名前です。つまり、次のように呼び出します。

write_to_file test.file
于 2013-02-01T00:28:54.293 に答える