fish shellのコマンド置換は”`”バッククォートや”$()”ドルマークカッコでなく”()”を使う

タイトルの通り、fish shellでの、コマンド置換方法にについて、記載しています。

shやBashでは、”`”バッククォートや”$()”ドルマークカッコで記載しますが、
fish shellでは、”()”カッコで記載します。

fish shellのバージョンは3.1.2で実行しています。公式チュートリアルURL

fish shellのコマンド置換

コマンド置換では、あるコマンドの出力を別のコマンドの引数として使用します。他のシェルとは異なり、fishはコマンド置換にバックティックを使用しません。代わりに、括弧を使用します。

コマンド

echo In (pwd), running (uname)

実行例

> echo In (pwd), running (uname)
In /home/ubuntu, running Linux

コマンド出力結果を変数に設定

変数”os”に”uname”の出力結果を代入します。

> set os (uname)
> echo $os
Linux

“ダブルクォート内に指定

コマンド置換で日付をファイル名として指定します。

> touch "testing_"(date +%Y%m%d)".txt"
> ls *.txt
testing_20200517.txt

Bash(Shell)でディレクトリ、リストをforループする

よく使うのでメモとして掲載します。

Bash(Shell)でディレクトリ、リストをforループする サンプルコード


#!/bin/bash

echo "ディレクトリ直下のファイルをループ"
dir_path="sample_dir/*"
for dir in $dir_path; do
    echo "$dir"
done

echo --------------------------

# リスト定義
declare -a list=(
    "foo"
    "bar"
    "baz"
)

echo "リストをループする"
for row in "${list[@]}"; do
    echo "$row"
done

echo "インデックス付きでリストをループする"
for i in "${!list[@]}"; do
    echo "$i : ${list[$i]}"
done

echo --------------------------

echo "連番でループ{}"
for i in {0..3}; do
    echo ${i}
done

echo "連番でループ seq"
for i in $(seq 0 3); do
    echo "$i"
done

実行結果


# ディレクトリ直下のファイルをループ
sample_dir/sample_01.txt
sample_dir/sample_02.txt
--------------------------
# リストをループする
foo
bar
baz
# インデックス付きでリストをループする
0 : foo
1 : bar
2 : baz
--------------------------
# 連番でループ{ }
0
1
2
3
# 連番でループ seq
0
1
2
3


ディレクトリ直下のファイルをfor文でループ


#!/bin/bash

# ディレクトリ直下のファイルをループ
dir_path="sample_dir/*"
echo "\$dir_path -> " $dir_path
for dir in $dir_path; do
    echo "$dir"
done

# 結果
# 
# $dir_path ->  sample_dir/sample_01.txt sample_dir/sample_02.txt
# sample_dir/sample_01.txt
# sample_dir/sample_02.txt


リストをfor文でループ、インデックス付きfor文でループ

#!/bin/bash

# リスト定義
declare -a list=(
    "foo"
    "bar"
    "baz"
)

# リストをループする
echo "\$\"{list[@]}\" -> " "${list[@]}"
for row in "${list[@]}"; do
    echo "$row"
done

echo

# インデックス付きでリストをループする
echo "\$\"{!list[@]}\" -> " "${!list[@]}"
for i in "${!list[@]}"; do
    echo "$i : ${list[$i]}"
done

# 結果
# 
# $"{list[@]}" ->  foo bar baz
# foo
# bar
# baz

# $"{!list[@]}" ->  0 1 2
# 0 : foo
# 1 : bar
# 2 : baz


連番をfor文でループ


#!/bin/bash

# 連番でループ {}
echo "{0..3} -> " {0..3}
for i in {0..3}; do
    echo ${i}
done

echo

# 連番でループ seq
echo "\$(seq 0 3) -> " $(seq 0 3)
for i in $(seq 0 3); do
    echo "$i"
done

# 結果
#
# {0..3} ->  0 1 2 3
# 0
# 1
# 2
# 3

# $(seq 0 3) ->  0 1 2 3
# 0
# 1
# 2
# 3

PostgreSQL psqlで引数とSQLファイルを指定して実行する

psqlとはPostgreSQLのターミナル型SQLクライアントです。

引数に指定した値をSQLファイルの変数にバインドします。

psqlで引数とSQLファイルを指定して実行する サンプルコード

sample.sql

実行するSQLファイル、”:変数”の箇所を置き換えます。

select :foo,
       :bar,
       :hoge;

p_exec_file.sh

実行するshellです。psqlを呼び出し、”-f”オプションでSQLファイルを指定し、”-v”オプションで引数名と値を設定します。”–echo-all”は実行したSQLを結果と一緒に出力します。

#!/bin/bash

DB_USER="{user_name}"
DB_PWD="{password}"
DB_SERVER="{db_server_url}"
DB_PORT="{db_port}"
DB_NAME="{db_name}"

psql \
    -d "postgresql://$DB_USER:$DB_PWD@$DB_SERVER:$DB_PORT/$DB_NAME" \
    -f "sample.sql" \
    -v foo="now()" \
    -v bar="1" \
    -v hoge="'test_str'" \
    --echo-all


実行結果

p_exec_file.shを実行します。実行したSQL文と結果が出力されます。”foo”に”now()”、”bar”に”1″(数値)、”hoge”に”test_str”(文字)が設定されています。

$ ./p_exec_file.sh
select :foo,
       :bar,
       :hoge;
              now              | ?column? | ?column?
-------------------------------+----------+----------
 2019-12-28 16:10:25.343578+09 |        1 | test_str
(1 行)

Bash(shell)の条件判定でandとorを使う

-aでANDを指定する

# true AND true
[ 2 -eq 2 -a 3 -eq 3 ];
echo "[ true AND true ] = [$?]"
# return [0]

# true AND false
[ 2 -eq 2 -a 3 -eq 4 ];
echo "[ true AND false ] = [$?]"
# return [1]


-oでORを指定する

# true OR false
[ 2 -eq 2 -o 3 -eq 4 ];
echo "[ true OR false ] = [$?]"
# return [0]

# false OR false
[ 2 -eq 5 -o 3 -eq 4 ];
echo "[ false OR false ] = [$?]"
# return [1]


&&でANDを指定する

# && (AND)
[ 2 -eq 2 ] && [ 3 -eq 3 ]; echo $?
# return [0]

[[ 2 -eq 2 && 3 -eq 4 ]]; echo $?
# return [1]


||でORを指定する

# || (OR)
[ 2 -eq 2 ] || [ 3 -eq 3 ]; echo $?
# return [0]

[[ 2 -eq 5 || 3 -eq 4 ]]; echo $?
# return [1]

Bash(shell)でパラメータ(引数)の必須チェックをする

パラメータ(引数)の数を表示する

# 引数の数を表示する
echo "引数の数は $# です"


パラメータ(引数)の数をチェックする

# 引数の数が2つかチェックする
if [ "$#" -eq 2 ]; then
  echo "引数の数は 2 です"
else
  echo "引数の数は 2 以外の $# です"
fi


パラメータ(引数)が空かチェックする(必須チェック)

# パラメータ1が空文字か判定
if [ -z "$1" ]; then
    echo "パラメータ1は、空文字です。"
else
    echo "パラメータ1は、空文字ではありません。入力文字は $1"
fi

# パラメータ2が空文字か判定
if [ -s "$2" ]; then
    echo "パラメータ2は、空文字です。"
else
    echo "パラメータ2は、空文字ではありません。入力文字は $2"
fi


バラメータ(引数)が数値のみかチェックする(数値型チェック)

if [[ $1 =~ ^[0-9]+$ ]]; then
  echo "パラメータ1は、数値のみです。"
else
  echo "パラメータ1は、数値以外の文字が含まれています。"
fi

Bash(shell)でディレクトリ・ファイルの存在チェックをする

ファイルの存在チェック

if [ -f "sample.txt" ]; then
    echo 'file exist'
else
    echo 'file not exist'
fi

ディレクトリの存在チェック

if [ -d "sample_dir" ]; then
    echo 'dir exist'
else
    echo 'dir not exist'
fi

ディレクトリが存在しなかったら作成する


DIR_PATH="sample_dir"

if [ ! -d "$DIR_PATH" ]; then
    mkdir -p $DIR_PATH
fi

[ ] -f オプション

ファイルが存在する場合、True。存在しない場合、False。

[ ] -d オプション

ディレクトリが存在する場合、True。存在しない場合、False。