「シェルスクリプトの基礎 - IFS」の版間の差分
細 (Wiki がページ「IFSで区切り文字を変更する方法(シェルスクリプト)」を「シェルスクリプトの基礎 - IFS」に、リダイレクトを残さずに移動しました) |
細 (文字列「__FORCETOC__」を「{{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This pag…) |
||
(同じ利用者による、間の2版が非表示) | |||
6行目: | 6行目: | ||
<br> | <br> | ||
例えば、csvファイルを読み込む場合は、IFSにカンマ(,)を設定する。<br> | 例えば、csvファイルを読み込む場合は、IFSにカンマ(,)を設定する。<br> | ||
<br> | |||
現在のIFSの確認するには、以下のコマンドを実行する。<br> | |||
echo $IFS | od -ac | |||
<br><br> | <br><br> | ||
14行目: | 17行目: | ||
まず、IFSを設定せずに内容を抜き出せるか確認する。<br> | まず、IFSを設定せずに内容を抜き出せるか確認する。<br> | ||
実行すると、初期設定では区切り文字にコロン(:)は設定されていないため、1行が全て変数USERに格納される。<br> | 実行すると、初期設定では区切り文字にコロン(:)は設定されていないため、1行が全て変数USERに格納される。<br> | ||
< | <syntaxhighlight lang="sh"> | ||
#!/bin/bash | #!/bin/bash | ||
21行目: | 24行目: | ||
echo "$USER $LOGINSHELL" | echo "$USER $LOGINSHELL" | ||
done | done | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
# 出力 | # 出力 | ||
36行目: | 39行目: | ||
ユーザ名とログインシェルを抜き出して表示する。<br> | ユーザ名とログインシェルを抜き出して表示する。<br> | ||
最後に、変数OLDIFSを使用してIFSの設定を元に戻す。<br> | 最後に、変数OLDIFSを使用してIFSの設定を元に戻す。<br> | ||
< | <syntaxhighlight lang="sh"> | ||
#!/bin/bash | #!/bin/bash | ||
48行目: | 51行目: | ||
IFS=$OLDIFS | IFS=$OLDIFS | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
# 出力 | # 出力 | ||
69行目: | 72行目: | ||
まず、IFSを初期設定のままで実行する。<br> | まず、IFSを初期設定のままで実行する。<br> | ||
IFSの初期設定は、空白、タブ、改行となっているため、空白で区切られた文字が1文字ずつ変数iに格納されて、1文字ずつ表示する。<br> | IFSの初期設定は、空白、タブ、改行となっているため、空白で区切られた文字が1文字ずつ変数iに格納されて、1文字ずつ表示する。<br> | ||
< | <syntaxhighlight lang="sh"> | ||
#!/bin/bash | #!/bin/bash | ||
76行目: | 79行目: | ||
echo $i | echo $i | ||
done | done | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
# 出力 | # 出力 | ||
91行目: | 94行目: | ||
次に、IFSの値を空に設定して実行する。<br> | 次に、IFSの値を空に設定して実行する。<br> | ||
区切り文字として空白が設定されていないため、1列全部が変数iに格納されて、1行ずつ表示する。<br> | 区切り文字として空白が設定されていないため、1列全部が変数iに格納されて、1行ずつ表示する。<br> | ||
< | <syntaxhighlight lang="sh"> | ||
#!/bin/bash | #!/bin/bash | ||
103行目: | 106行目: | ||
IFS=$OLDIFS | IFS=$OLDIFS | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
# 出力 | # 出力 | ||
110行目: | 113行目: | ||
g i j | g i j | ||
<br><br> | <br><br> | ||
{{#seo: | |||
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki | |||
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 | |||
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux | |||
|image=/resources/assets/MochiuLogo_Single_Blue.png | |||
}} | |||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:シェルスクリプト]] | [[カテゴリ:シェルスクリプト]] |
2024年10月14日 (月) 10:38時点における最新版
概要
環境変数IFS(Internal Filed Separator)には、bashの場合、スペース、タブ、改行($' \t\n')が初期設定されており、
これらが区切り文字(デリミタ)として認識されている。
ファイル等を読み込む場合、文字列の区切り文字を変更するには、IFSに区切り文字とする値を設定することができる。
例えば、csvファイルを読み込む場合は、IFSにカンマ(,)を設定する。
現在のIFSの確認するには、以下のコマンドを実行する。
echo $IFS | od -ac
区切り文字を設定
区切り文字の設定例として、/etc/passwdファイルからユーザ名とログインシェルの情報を抜き出して表示させる。
この場合、/etc/passwdファイルの各フィールドの区切り文字はコロン(:)である。
まず、IFSを設定せずに内容を抜き出せるか確認する。
実行すると、初期設定では区切り文字にコロン(:)は設定されていないため、1行が全て変数USERに格納される。
#!/bin/bash
head -n 5 /etc/passwd | while read USER PASS USERID GROUPID COMMENT HOMEDIR LOGINSHELL
do
echo "$USER $LOGINSHELL"
done
# 出力 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
次に、IFSに:を設定して確認する。
まず、現在のIFSの設定を変数OLDIFSでバックアップした後、IFSにコロン(:)を設定する。
更に、/etc/passwdファイルの各フィールドを、それぞれ変数USER、PASS、USERID、GROUPID、COMMENT、HOMEDIR、LOGINSHELLに格納して、
ユーザ名とログインシェルを抜き出して表示する。
最後に、変数OLDIFSを使用してIFSの設定を元に戻す。
#!/bin/bash
OLDIFS=$IFS
IFS=:
head -n 5 /etc/passwd | while read USER PASS USERID GROUPID COMMENT HOMEDIR LOGINSHELL
do
echo "$NAME $LOGINSHELL"
done
IFS=$OLDIFS
# 出力 root /bin/bash bin /sbin/nologin daemon /sbin/nologin adm /sbin/nologin lp /sbin/nologin
空白やタブを含む文字列を扱う
空白やタブなどを区切り文字にしない場合は、IFSの値を空にすることで、空白やタブで区切ることなく読み込むことができる。
以下のシェルスクリプトでは、空白を含むlist.txtファイルを使用して確認する。
# list.txtファイルの内容 a b c d e f g i j
まず、IFSを初期設定のままで実行する。
IFSの初期設定は、空白、タブ、改行となっているため、空白で区切られた文字が1文字ずつ変数iに格納されて、1文字ずつ表示する。
#!/bin/bash
for i in $(cat ./list.txt)
do
echo $i
done
# 出力 a b c d e f g i j
次に、IFSの値を空に設定して実行する。
区切り文字として空白が設定されていないため、1列全部が変数iに格納されて、1行ずつ表示する。
#!/bin/bash
OLDIFS=$IFS
IFS=
for i in $(cat ./list.txt)
do
echo $i
done
IFS=$OLDIFS
# 出力 a b c d e f g i j