初心者のWEBデザイン

HTML,CSS、その他WEBデザインに関する事を記述していきます.

Shell Script [[ ]] を用いた比較方法

testコマンド [] よりも での比較はShellScript以外のプログラム言語と
似たような記述が可能になります。

[ ]だとAND演算やOR演算は【-a】や【-o】を用いますが、
では&&・||が使用できます。

x=30
if [[ $x -gt 10 && $x -lt 50 ]]; then
  echo 'x > 10 AND x < 50'
else
  echo 'x <= 10 OR x >= 50'
fi
#出力結果 x > 10 AND x < 50

内で==・!=を記述した場合には右辺にパターン文字列を使用できます。

==を使用する
str=cat
if [[ $str == c* ]]; then
  echo Yes
else
  echo No
fi

#出力結果 YES
!=を使用する
str1=cat
str2=bird

if [[ $str1 != c* ]]; then
  echo Yes
else
  echo No
fi

# catとc**はマッチするが!がついているのでFalseになります。
#出力結果 No

if [[ $str2 != c* ]]; then
  echo Yes
else
  echo No
fi

# birdとc**はマッチしませんが、!がついているのでTrueになります。
#出力結果 Yes
パターンマッチ(=~)

正規表現を用いて比較する方法

str='/home/cat'
if [[ $str =~ ^/ho.*/[^/]*t$ ]]; then
  echo Yes
else
  echo No
fi

#出力結果 Yes

PHP XMLの@attributes要素のアクセス方法

下記のようなRSSなどのXMLを受け取ってごにょごにょしたい場合のアクセス方法は
var_dump($rss->link);
//object(SimpleXMLElement)#2 (1) { ["@attributes"]=> array(1) { ["href"]=> string(34) "http://example.com/" } }
こうするのだそうですよ〜
var_dump($rss->link->attributes()->href);
//object(SimpleXMLElement)#3 (1) { [0]=> string(34) "http://example.com/" }

Shell Script 関数の呼び出し確認

関数内で関数名を参照したい場合にはFUNCNAME変数を確認します。
この変数は呼び出した関数を実行している間のみ存在します。

FUNCNAME変数は主にどの関数で処理を実行したかを表示するときや、
デバッグ時に利用されます。

function print() {
  echo Hello World
  echo Function Name is ${FUNCNAME}
}
print

#実行結果
#Hello World
#Function Name is print

Atom Settingファイルをgistと同期する

Atom Editorをどの環境でも同じ設定にしたい場合の同期方法を記載します。


必要なもの
Atom:sync-settings(パッケージ)
GitHub:アクセストーク
Gist:GistID

パッケージを同期する「sync-settings」をインストール

terminal上から下記を入力

apm install sync-settings

GitHubでアクセストークンを発行する

  1. 右上のアカウントアイコンをクリックし、Settingを選択
  2. 左のメニューからPersonal settings > Developer settings > Personal access tokensと順にクリック
  3. 画面右のGenerate new tokenをクリック
  4. 任意の名前をつけgistだけ選択し下部のGenerate TokenをクリックしTokenを控えておきます。

Secret Gist の作成

Discover gists · GitHub

アクセスし任意のファイル名を入力したファイルを作成します。
このファイルは使用しませんので、特に内容はなんでも構いません。

URLのGist IDを控えときます。
https://gist.github.com/ユーザー名/[Gist ID]】

Atomに設定ファイルに書き込む

Atomの個人設定ファイルに先ほど控えたアクセストークンとGistIDを入力します。

  "sync-settings":
    gistId: "GistID"
    personalAccessToken: "アクセストークン"

これで同期の準備が整いました。


あとはコマンドパレットからSync-Setting:Backupを選択すれば
バックアップが完了します。

詳しい使用方法は下記に詳しく載っています。
atom.io

ShellScript コマンドのグループ化・サブシェル

複数のコマンドを実行した出力をまとめて、1つのファイルに
リダイレクトする方法を記述します。

コマンドのグループ化

{}カールブラケットを使用

{
	date +%Y-%m-%d
	echo  ‘Documents List’
	ls ~/Documents
} > DirectoryList.txt

サブシェルによるコマンドのグループ化

()ブラケットを使用
ブラケット内は現在のシェルから子プロセスとして
新しいシェルプロセスが起動されその中で実行されます。
なのでブラケットの外側の親のシェルプロセスに影響を与えません。
ブラケット内でcdコマンドでディレクトリを移動するなど環境を変更しても
サブシェルから抜けると環境が親のシェルプロセス(元のディレクトリ)に戻ります。

cd ~/Pictures
( #ブラケット内はサブシェル適応
	echo ’Sub Shel’
	pwd

	echo ’cd  in Sub Shell’
	cd ~/Documents
	pwd
) 
#親のシャルプロセスに戻る
pwd


#実行結果
# ’Sub Shel’
# /Users/ユーザー名/Pictures
#’cd in Sub Shell’
#/Users/ユーザー名/Documents
#/Users/ユーザー名/Pictures

bash ShellScript リダイレクト まとめ

bashでコマンドを実行するときに標準入出力の入力元と出力先を
置換することをリダイレクトと言います。

ファイルディスクリプタ

プロセスから開かれた全てのファイルには、ファイルディスクリプタ
呼ばれる番号が割り当てられます。
プロセスからファイルを参照する際の識別番号です。

名前 ファイルディスクリプタ
標準入力 0
標準出力 1
標準エラー出力 2

よくコマンドのエラーメッセージに使用される
2> /dev/nullの正体はまさにこのファイルディスクリプタ
エラーの出力(ファイルディスクリプタが2番)を/dev/null/
に書き込んでいます。
通常のファイルであればエラー出力が書き込まれるのですが
/dev/null/に書き込んでもデータは全てなくなる為、
結果としてエラーの出力もされず、書き込みもない状態となります。

/dev/null/の特徴
  • 読み込んでも何もデータは返されない
  • データを読み込んでも書き込まれるはなく消える

リダイレクトに関する記号表

記号 内容
< file 標準入力をfileに変更する
> file 標準出力をfileに変更する
>>file 標準出力をfileの末尾に追加する
> file noclobberの設定を無視して、標準出力をfileに変更する
f2> file 標準エラー出力をfileに変更する
2>> file 標準エラー出力をfileに変更する
2> file noclobberの設定を無視して、標準出力をfileに変更する
>&i 標準出力をファイルデゥクリプタi番のコピーにする
j>&i ファイルディスクリプタj番をファイルディクスリプタi番のコピーにする
&> file 標準出力と標準エラー出力の両方をfileに変更する(fileがあった場合は上書きされる)
&>> file 標準出力と標準エラー出力の両方をfileの末尾に追加する

※【>】は同名のfileがあった場合は、内容が全て書き換わってしまうので
使用する際には注意が必要です。

ShellScript パターン指定

Shellには変数に対して、削除するパターンが指定できます。

前方・後方からの検索があり、最短マッチと最長マッチで動作が変わります。

dirname・basenameと同じ動きをする記述です。

前方一致(前から検索)
# ${変数名##パターン} # 前方からの最長マッチを削除

SCRIPT='/Users/ユーザー名/Dropbox/Program/ShellScript/test.sh'
${SCRIPT##*/}  #変数に対してbasenameを行う ワイルドカードで一番最後の/までマッチする
#出力結果 test.sh
後方一致(後ろから検索)
# ${変数名%パターン} # 後方からの最短マッチを削除

SCRIPT='/Users/ユーザー名/Dropbox/Program/ShellScript/test.sh'

${SCRIPT%/*}  #動作はdirnameと同じ 後方から一番最初の/までを削除
#出力結果 /Users/ユーザー名/Dropbox/Program/ShellScript

dirnameやbasenameより数倍〜数十倍動作は早いです。

Linux Ubuntu Macにデュアルブートした際の初期設定

  1. Mac OSXでディスクユーティリティでLinuxの容量をパーティションを作成(Swap領域も作成)
  2. OSをアップデート
  3. 日本語環境を設定
  4. かなと英数にIMEのOn・Offを割り当てる
  5. ⌘とCtrlを交換する

設定

1.iBusからFcitxに切り替える
2. 次の,前のソースへ切り替えを両方空にする.
3. 入力ソースに日本語,Mozc(Fcitx)を追加し,日本語を一番上にする.
4. sudo dpkg-reconfigure keyboard-configurationでキーボードを(Apple アルミニウムキーボード (JIS),日本語,日本語,キーボード配置のデフォルト,コンポーズキーなしに設定する.
5. Fcitxの設定で全体の設定を開き,拡張オプションを表示にチェックマークをつけ,入力メソッドをオンにの項目にHiraganakatakanaを,入力メソッドをオンにの項目にMuhenkanを割り当てる.
6. Mozcの設定でキー設定を編集し,エントリー追加から,入力文字なし,Hiragana,ひらがなに入力切替,を追加する.
7. さらに入力キー順にソートし,Hiraganaが設定されている部分のコマンドをひらがなに入力切替に設定する.

下記のエラーの対処法
$ sudo apt-get update
...
E: Problem executing scripts APT::Update::Post-Invoke-Success 'if /usr/bin/test -w /var/cache/app-info -a -e /usr/bin/appstreamcli; then appstreamcli refresh > /dev/null; fi'
E: Sub-process returned an error code

これで問題なくupdateが通る

cd /tmp && mkdir asfix
cd asfix
wget https://launchpad.net/ubuntu/+archive/primary/+files/appstream_0.9.4-1ubuntu1_amd64.deb
wget https://launchpad.net/ubuntu/+archive/primary/+files/libappstream3_0.9.4-1ubuntu1_amd64.deb
sudo dpkg -i *.deb

bash grep 拡張子の指定・除外

特定の拡張子のみ対象にする
# 複数指定 
grep -r "^<\!DOCTYPE html>" --include='*.html' --include='*.php'
特定の拡張子を除外する
# 複数指定 
grep -r "cat" --exclude='*.class' --exclude='*.js'

便利なオプション

  • i:検索文字列の大文字小文字を区別しなくなる。
  • r:サブディレクトリも対象にする。
  • l:ヒットしたファイル名のみ出力する。このオプションを外せばヒットした箇所も含めて出力する。

bash sedコマンド 健忘録

動作確認に使用するファイルは下記になります。

1
animal
cat
dog
bird
2
animal
cat
dog
bird
3
animal
cat
dog
bird


s/ 検索文字 / 置換文字 /で正規表現も使用できます。

マッチした文字を置換する
echo 'animal dog' | sed 's/dog/cat/'
# 出力
# animal cat
マッチした文字を全て置換する

オプション【g】を追加

echo 'animal dog dog dog' | sed 's/dog/cat/g'
# 出力
# animal cat
catコマンドで表示した内容を置換する

ファイルには書き込まず、置換した内容だけを表示します。
dogをcatに置換

cat animal.txt |sed s/dog/cat/ #動作は同じ
sed "s/dog/cat/" animal.txt #動作は同じ
#出力結果
#1
#animal
#cat
#cat
#bird
#2
#animal
#cat
#cat
#bird
#3
#animal
#cat
#cat
#bird
ファイルを直接編集する場合

置換内容をファイルに書き込む場合にはオプション【i】を使用します。

sed -i s/dog/cat/ animal.txt
#ファイルの内容が書き換わります。
#1
#animal
#cat
#cat
#bird
#2
#animal
#cat
#cat
#bird
#3
#animal
#cat
#cat
#bird