Bashスクリプトエラー:./test:5行目:UID:読み取り専用変数


9

開発サーバーで正常に機能するスクリプトがありますが、本番環境で実行しようとしても機能しません。

理解できない次のエラーが発生します。

./test.sh:5行目:UID:読み取り専用変数

助言がありますか?

#!/bin/sh

    while read inputline
    do
     UID="$(echo $inputline | cut -d '"' -f4)"
     PASSWORD="$(echo $inputline | cut -d '"' -f8)"
     FIRST="$(echo $inputline | cut -d '"' -f6 | cut -d ' ' -f1)"
     LAST="$(echo $inputline | cut -d '"' -f6 | cut -d ' ' -f2)"    

    zmprov createAccount $UID $PASSWORD displayName "$FIRST $LAST" givenName $FIRST sn $LAST    

    done < company.csv

回答:


17

大文字の変数は通常シェルの内部用に予約されているため、シェルスクリプトでは小文字の変数を使用することをお勧めします。(環境変数はこれの例外ですが、何をしているのか理解せずに恣意的に変更してはならない特別な意味を持つものとして、実際には同じように扱う必要があります。)この場合、実行中のUnix uidにbash設定$UIDします。の下で、それを変更したり、変数を他の目的で使用したりすることはできません。以外のシェルbashshかもしれdash使用することはできませんか、いくつかのプラットフォーム上でいくつかの他のシェル)$UID、そのようにしている場合bashのように呼び出されたときのBourneシェル互換モードで動作するように構築されたsh(これがデフォルトですが、多くのLinuxディストリビューションであることを無効にする)それは勝ちました扱います$UID 特別なものとして。


5

UIDスクリプトが実行されているユーザーIDに関する情報を含むシステム予約変数です。システムが使用している可能性のある標準変数名を使用しないように注意する必要があります。env現在設定されているもののリストを取得するために使用できます。これらは変更しないでください。変数名をグーグルして、先に進む前に他のユーザーに表示されるかどうかを確認することもできます。

この場合、大文字のバリアントのみが予約されているため、小文字を使用すると問題が解決する可能性がありますが、$ input_uidなどの変数を呼び出して変数を一意にすることもできるため、スクリプトへの入力から値が取得されることは明らかです。これにより、コードを長期的に維持しやすくなります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.