かなり気分的な技術日記

日々の勉強メモです

【Linux#4】シェルスクリプトで変数への代入時に = の前後にスペースを入れてはいけない

概要

シェルスクリプトで変数への代入時に = の前後にスペースを入れてはいけない。

内容

変数に値を代入するときは、「変数名=値」の形式で書く。
「変数名 = 値」のように=の前後にスペースを入れると、=の前の文字列が変数ではなく、コマンドとして扱われてエラーになる。
hoge.sh

#!/bin/bash

var='hoge'
echo $var

ターミナル

$ ./hoge.sh
hoge

=の前後にスペースを入れた場合
hoge.sh

#!/bin/bash

var = 'hoge'
echo $var

ターミナル

$ ./hoge.sh
./hoge.sh: 行 3: var: コマンドが見つかりません

「varというコマンドに=と'hoge'という引数を与えている」と解釈される。

【Linux#3】ls -lコマンドでサブディレクトリ含めてフルパスで出力する方法

概要

ls -lコマンドの出力結果をサブディレクトリ含めてフルパスで出力したい。

内容

方法

以下のように、コマンド置換を使用して、出力結果の詳細リストを表示することができる。

$ ll -d $(find tmp)
drwxrwxr-x. 4 root root   92  2月 10 10:50 tmp
drwxrwxr-x. 3 root root   18  2月 10 01:13 tmp/hoge
-rwxrwxrwx. 1 root root  283  1月 24 23:06 tmp/my.sh
-rw-rw-r--. 1 root root   43  1月 18 21:40 tmp/aaa.txt
drwxrwxr-x. 4 root root  124  2月 10 02:10 tmp/test
-rw-rw-r--. 2 root root   12  2月 10 00:28 tmp/test/bbb.txt

もしくは、

$ ll -d `find tmp`

参考記事

以下の記事がとても勉強になりました。
ls -lコマンドの結果をサブディレクトリ含めてフルパスで列挙したい #Linux - Qiita
シェルスクリプトのコマンド置換 #Linux - Qiita

【Linux#2】CentOSでyumエラーが出た場合の対処方法

概要

yumコマンドを実行した際、http://~ Not Foundのようなエラーが発生した場合の対処方法。

内容

エラー内容

$ yum list
読み込んだプラグイン:fastestmirror, langpacks
Determining fastest mirrors
http://mirror.centos.org/centos/7/extras/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
他のミラーを試します。
To address this issue please refer to the below wiki article

https://wiki.centos.org/yum-errors

If above article doesn't help to resolve this issue please use https://bugs.centos.org/.



 One of the configured repositories failed (CentOS-7 - Extras),
 and yum doesn't have enough cached data to continue. At this point the only
 safe thing yum can do is fail. There are a few ways to work "fix" this:

     1. Contact the upstream for the repository and get them to fix the problem.

     2. Reconfigure the baseurl/etc. for the repository, to point to a working
        upstream. This is most often useful if you are using a newer
        distribution release than is supported by the repository (and the
        packages for the previous distribution release still work).

     3. Run the command with the repository temporarily disabled
            yum --disablerepo=extras ...

     4. Disable the repository permanently, so yum won't use it by default. Yum
        will then just ignore the repository until you permanently enable it
        again or use --enablerepo for temporary usage:

            yum-config-manager --disable extras
        or
            subscription-manager repos --disable=extras

     5. Configure the failing repository to be skipped, if it is unavailable.
        Note that yum will try to contact the repo. when it runs most commands,
        so will have to try and fail each time (and thus. yum will be be much
        slower). If it is a very temporary problem though, this is often a nice
        compromise:

            yum-config-manager --save --setopt=extras.skip_if_unavailable=true

failure: repodata/repomd.xml from extras: [Errno 256] No more mirrors to try.
http://mirror.centos.org/centos/7/extras/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found

原因

サポート終了などの古いCentOSの場合に、データ取得先のURLが見つからないということ。

対処方法

以下のディレクトリにあるyumリポジトリの設定ファイルを開き、baseurlをvault.centos.orgに変更する。
vault.centos.orgは、サポート終了などによる過去のCentOSのパッケージを保管しているアーカイブサイト。

$ vi /etc/yum.repos.d/CentOS-Base.repo

[base]
name=CentOS-$releasever - Base
#mirrorlist=http://vault.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
baseurl=http://vault.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
enabled = 0
skip_if_unavailable = 1
keepcache = 0

#released updates
[updates]
name=CentOS-$releasever - Updates
#mirrorlist=http://vault.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
baseurl=http://vault.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
#mirrorlist=http://vault.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
baseurl=http://vault.centos.org/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
#mirrorlist=http://vault.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
baseurl=http://vault.centos.org/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

yumのキャッシュをクリアしてから、再度yumコマンドを実行。

$ yum clean all

補足

yum info centos-releaseで、$releaseverや$basearchの値を確認できる。

$ yum info centos-release
読み込んだプラグイン:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
インストール済みパッケージ
名前                : centos-release
アーキテクチャー    : x86_64
バージョン          : 7
リリース            : 9.2009.1.el7.centos
容量                : 44 k
リポジトリー        : installed
提供元リポジトリー  : anaconda
要約                : CentOS Linux release file
ライセンス          : GPLv2
説明                : CentOS Linux release files

利用可能なパッケージ
名前                : centos-release
アーキテクチャー    : x86_64
バージョン          : 7
リリース            : 9.2009.2.el7.centos
容量                : 27 k
リポジトリー        : updates/7/x86_64
要約                : CentOS Linux release file
ライセンス          : GPLv2
説明                : CentOS Linux release files

【Python#11】f文字列(フォーマット済み文字列)の使い方

概要

f文字列を使用した書き方

内容

フォーマットf(書式指定)の方法には以下の3種類ある。
※ここでは各スタイルの細かいオプションは説明しない。

  • 古いスタイル(format_string % data)

  • 新しいスタイル({}とformat())

  • 最新のスタイル(f文字列)

古いスタイル(format_string % data)

>>> cat = 'Chester'
>>> weight = 28
>>> "Our cat %-12.3s weights %d pounds" % (cat, weight)
'Our cat Che          weights 28 pounds'

右寄せとか文字数上限は書式指定文字列で指定する。

新しいスタイル({}とformat())

>>> cat = 'Chester'
>>> weight = 28
>>> 'Our cat {1:<10d} weights {0:^10s} pounds'.format(cat, weight)
'Our cat 28         weights  Chester   pounds'

{n}で何番目の引数を使用するか指定ができる。 右寄せとか文字数上限は{}の中で:に続けて指定する。

最新のスタイル(f文字列)

>>> cat = 'Chester'
>>> weight = 28
>>> f'Our cat {cat:>20} weights {weight:^10} pounds'
'Our cat              Chester weights     28     pounds'

format()の中でやっていたことをメインの書式指定文字列の{}の中でできる。

【Python#10】inによる多重比較

概要

in演算子を使用した書き方

内容

以下のような長いif文を

>>> letter = 'o'
>>> if letter == 'a' or letter == 'e' or letter =='t' \
...    or letter == 'o' or letter == 'u':
...    print(letter, 'is a vowel')
... else:
...    print(letter, 'is not a vowel')
...
o is a vowel

in演算子を使用して、以下のように記述することできる。

>>> vowels = 'aeiou'
>>> letter = 'o'
>>> letter in vowels
True
>>> if letter in vowels:
...     print(letter, 'is a vowel')
...
o is a vowel

各種データ型に対するinの使い方

>>> letter = 'o'
>>>
>>> # 配列
>>> vowel_set = {'a', 'e', 'i', 'o', 'u'}
>>> letter in vowel_set
True
>>> # リスト
>>> vowel_list = ['a', 'e', 'i', 'o', 'u']
>>> letter in vowel_list
True
>>> # タプル
>>> vowel_tuple = ('a', 'e', 'i', 'o', 'u')
>>> letter in vowel_tuple
True
>>> # 辞書
>>> vowel_dict = {'a':'apple', 'e':'elephant', 
...               'i':'impala', 'o':'ocelot', 'u':'unicorn'}
>>> letter in vowel_dict
True
>>> # 文字列
>>> vowel_string = "aeiou"
>>> letter in vowel_string
True

【Python#9】andで比較する場合のシンプルな書き方

概要

andで比較する場合のシンプルな書き方

内容

1個の変数に対する複数の比較をandする場合、Pythonでは次のようなコードを

>>> x = 7
>>> 5 < x and x < 10
True

以下で記述することできる。

>>> x = 7
>>> 5 < x < 10
True

【Python#8】切り捨ての整数除算(//)

概要

切り捨ての整数除算について

内容

除算には2種類ある。

/による浮動小数点数(10進)除算

整数を整数で割るときに、/を使用すると、結果は浮動小数点数で返される。

>>> 9 / 5
1.8

//による整数(切り捨て)除算

切り捨ての整数除算は整数の結果を返し、剰余は捨てられる。

>>> 9 // 5
1

どちらも、ゼロ除算した場合は、Python例外が発生する。

>>> 5 / 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero # 0による除算
>>> 7 // 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero # 0による整数除算または剰余