r_bash – Telegram
Repository updater

Need a repo updater and need to implement in your custom bash noscripts to make your noscript up-to-date and monitor for the updates??, here it is called repo-updater

Needs a code update for better use

It was originally created for Android Sysinfo noscript to check updates here


https://redd.it/1gy2ybp
@r_bash
Ble-sh Performance Tune Help

Hello everyone,

I am a newbie Ble-sh user. I installed it using all default configurations. I think it's a bit slow, and that latency bothers me a lot. I would like to know some good tips to tune the performance. Do you mind sharing them with me?
I appreciate any help you can provide.

PS: I also use Atuin integrated with it. I would greatly appreciate any performance tunes upon it as well.

https://redd.it/1gzn6gu
@r_bash
Clicraft: An Unofficial CLI Minecraft clone

Hello! I am a relatively new Linux user and I spent the better part of a month working on a project called clicraft. It is available at https://github.com/DontEvenTalkToMe/clicraft ! Please do check it out and give me some feedback as I would like to develop my skills further, thanks!

https://redd.it/1h08y46
@r_bash
How to expand array in string?

I'm trying to make the noscript support the usage described below and am having trouble passing $DIRS (directory names as arguments) to fzf as a string. Pretty sure converting array to string should be avoided, but what are alternatives? A directory could contain a space.

# Usage: re <pattern> dirs

trap 'rm /tmp/.rg-fzf-{f,r} >/dev/null 2>&1' EXIT INT QUIT TERM

INITIALQUERY="$1"
shift
DIRS=( "$@" )
RG
PREFIX="rg --column --line-number --no-heading --color=always --smart-case"

fzf --ansi --disabled --query "$INITIALQUERY" \
--bind "start:reload:
$RGPREFIX {q} ${DIRS*}" \
--bind "change:reload:sleep 0.1; $RGPREFIX {q} ${DIRS[*]} || true" \
--bind 'ctrl-r:transform:[[ ! $FZF
PROMPT =~ ripgrep ]] &&
echo "rebind(change)+change-prompt(1. ripgrep> )+disable-search+transform-query:echo \{q} > /tmp/.rg-fzf-f; cat /tmp/.rg-fzf-r" ||
echo "unbind(change)+change-prompt(2. fzf> )+enable-search+transform-query:echo \{q} > /tmp/.rg-fzf-r; cat /tmp/.rg-fzf-f"' \
... \
--bind 'enter:become(nvim {1} +{2})'

Basically I'm trying to tweak this fzf command that uses rg (grep-like alternative) command to support taking the rest of the arguments starting from the second argument as directories to search for, with the first argument being the string to search for.

https://redd.it/1gxsqz4
@r_bash
help with bash noscript

im working on a bash noscript that takes two text files, input file contains some text and dictionary.txt contains a list of 4 letter words that exist in the input file. im trying to find all 4 letter words in file and compare then to the words in dictionary.txt, if a word in input does not exist in dictionary, print that four letter word. here is my noscript:

#!/bin/bash

# Check if the input file and dictionary file are provided
if [ $# -eq 0 ]; then
  echo "input file and dictionary missing"
  exit 1
fi

# Check if the input file is valid
input_file=$1
if [ ! -f "$input_file" ]; then
  echo "$input_file is not a file"
  exit 1
fi

# Check if the dictionary file is valid
dictionary_file=$2
if [ ! -f "$dictionary_file" ]; then
  echo "$dictionary_file is not a file"
  exit 1
fi

# Read the dictionary into an array
mapfile -t dictionary < "$dictionary_file"

# Convert dictionary array to lowercase for case-insensitive comparison
dictionary=("${dictionary[@],,}")

# Check the input file for 4-letter words
grep -o '\b[a-zA-Z]\{4\}\b' "$input_file" | while read word; do
  # Convert the word to lowercase
  word=$(echo "$word" | tr '[:upper:]' '[:lower:]')

  # Check if the word is NOT in the dictionary
  if ! [[ " ${dictionary[@]} " =~ " ${word} " ]]; then
    echo "$word"
  fi
done


#!/bin/bash


# Check if the input file and dictionary file are provided
if [ $# -eq 0 ]; then
  echo "input file and dictionary missing"
  exit 1
fi


# Check if the input file is valid
input_file=$1
if [ ! -f "$input_file" ]; then
  echo "$input_file is not a file"
  exit 1
fi


# Check if the dictionary file is valid
dictionary_file=$2
if [ ! -f "$dictionary_file" ]; then
  echo "$dictionary_file is not a file"
  exit 1
fi


# Read the dictionary into an array
mapfile -t dictionary < "$dictionary_file"


# Convert dictionary array to lowercase for case-insensitive comparison
dictionary=("${dictionary[@],,}")


# Check the input file for 4-letter words
grep -o '\b[a-zA-Z]\{4\}\b' "$input_file" | while read word; do
  # Convert the word to lowercase
  word=$(echo "$word" | tr '[:upper:]' '[:lower:]')


  # Check if the word is NOT in the dictionary
  if ! [[ " ${dictionary[@]} " =~ " ${word} " ]]; then
    echo "$word"
  fi
doneim working on a bash noscript that takes two text files, input file contains some text and dictionary.txt contains a list of 4 letter words that exist in the input file. im trying to find all 4 letter words in file and compare then to the words in dictionary.txt, if a word in input does not exist in dictionary, print that four letter word. here is my noscript: #!/bin/bash

# Check if the input file and dictionary file are provided
if [ $# -eq 0 ]; then
  echo "input file and dictionary missing"
  exit 1
fi

# Check if the input file is valid
input_file=$1
if [ ! -f "$input_file" ]; then
  echo "$input_file is not a file"
  exit 1
fi

# Check if the dictionary file is valid
dictionary_file=$2
if [ ! -f "$dictionary_file" ]; then
  echo "$dictionary_file is not a file"
  exit 1
fi

# Read the dictionary into an array
mapfile -t dictionary < "$dictionary_file"

# Convert dictionary array to lowercase for case-insensitive comparison
dictionary=("${dictionary[@],,}")

# Check the input file for 4-letter words
grep -o '\b[a-zA-Z]\{4\}\b' "$input_file" | while read word; do
  # Convert the word to lowercase
  word=$(echo "$word" | tr '[:upper:]' '[:lower:]')

  # Check if the word is NOT in the dictionary
  if ! [[ " ${dictionary[@]} " =~ " ${word} " ]]; then
    echo "$word"
  fi
done


#!/bin/bash


#
Check if the input file and dictionary file are provided
if [ $# -eq 0 ]; then
  echo "input file and dictionary missing"
  exit 1
fi


# Check if the input file is valid
input_file=$1
if [ ! -f "$input_file" ]; then
  echo "$input_file is not a file"
  exit 1
fi


# Check if the dictionary file is valid
dictionary_file=$2
if [ ! -f "$dictionary_file" ]; then
  echo "$dictionary_file is not a file"
  exit 1
fi


# Read the dictionary into an array
mapfile -t dictionary < "$dictionary_file"


# Convert dictionary array to lowercase for case-insensitive comparison
dictionary=("${dictionary[@],,}")


# Check the input file for 4-letter words
grep -o '\b[a-zA-Z]\{4\}\b' "$input_file" | while read word; do
  # Convert the word to lowercase
  word=$(echo "$word" | tr '[:upper:]' '[:lower:]')


  # Check if the word is NOT in the dictionary
  if ! [[ " ${dictionary[@]} " =~ " ${word} " ]]; then
    echo "$word"
  fi
done

https://redd.it/1gxdzdz
@r_bash
Cannot understand why less than is not working.

Greetings.


Background information, I'm attempting to write a noscript to semi-automate tarballing a bunch of archived logs into single file for clients to download. Logrotate uses 2 digit months and days for the filenames, meaning using 07 for the month of July instead of just 7. I'm attempting to do a test to see if the month entered is under 10, so I can then prepend the numeral 0 in front of the input so tar function works. I keep getting a "input_start_month: integer expression expected" error on the highlighted line

The kicker is that the less-than-or-equal-to test above this line works fine.

read -p "Enter starting month of logs to pull in numerical format: " inputstartmonth
read -p "Enter ending month of logs to pull in numerical format: (if only within a single month, just enter the month again): " inputendmonth

# Verify Month range is valid and fix single digit input to multiple digits, i.e 5 to 05
if input_start_month -le input_end_month ; then #THIS LINE WORKS
echo "Month range is valid."
if "$input_start_month" -lt 10 ; then #ERRORS HERE
$startmonth = "0$inputstartmonth"
else
$start
month = "$inputstartmonth"
fi

if $input_end_month -le 9 ; then
$endmonth = "0$inputendmonth"
else
$end
month = "$inputendmonth"
fi
else
echo "ERROR! Month range is invalid."
exit 1;
fi



https://redd.it/1h16ey0
@r_bash
Linux Foundation Certificate Shell Scripting using Bash (SC103)

I got a coupon to attempt the certificate exam SC103 from The Linux Foundation. Wondering if anyone has given this exam? How should I prepare specifically for this exam as this would be online proctored exam. I have few months before the voucher expires. Any suggestions would be appreciated.

https://redd.it/1h1qfjy
@r_bash
Parsing byte counts

A few noscripts I wrote have "byte count" as an optional input. Id like these to accept using prefixes (e.g., 64 kb or 128 MiB). But, there are 2 competing systems at play here.

kilobyte is 1000, megabyte is 1000^2, etc.
kibibyte is 1024, mebibyte is 1024^2, etc.

Is there some universally agreed upon syntax for which prefic abbreviations map to 1000^n vs which map to 1024^N?

NOTE: for my use cases it doesnt make sense to specify bit count, so wshether or not there is a trailing b or B it will always refer to bytes.

My intuition here is that

1000^N:

k, kb, kB --> 1000
m, mb, mB --> 1000^2
etc.

1024^N:
K, Ki, ki, Kb, Kib, kib, KB, KiB, kiB --> 1024
M, Mi, mi, Mb, Mib, mib, MB, MiB, miB --> 1024^2
etc.

Are there any commonly used programs that would conflict with this mapping?



As far as the actual implementation, I use something like

getBytes() {

local +i nn
local -A byteMap

byteMap=([k]=1 [m]=2 [g]=3 [t]=4 [p]=5 [e]=6)

for nn in "${@}"; do
nn="${nn//[bB ]/}"
case "${nn}" in
kmgtpe)
echo "$(( ${nn//^0-9/} ( 1000 ${byteMap[${nn//[0-9]/}]} ) ))"
;;

KMGTPEIi)
nn="${nn,,}"
nn="${nn%i}"
echo "$(( ${nn//^0-9/} ( 1024 ${byteMap[${nn//[0-9]/}]} ) ))"
;;
)
echo "${nn//^0-9/}"
;;
esac
done

}

but if anyone has a better implementation please do suggest it!

https://redd.it/1h230p8
@r_bash
Understanding heredoc variable substitution

Hello, I'm confused about the output of this noscript:

Foo="bar"
cat << EOF
a $Foo
$Foo
EOF

This outputs:

a bar
Foo

It looks like variables at the start of a line don't get substituted. Can I work around that?

https://redd.it/1h2kcfd
@r_bash
Can someone ELI5 "trailing newline", what the -n command means, the -e command and what "echo" is?

I am trying to have an understanding of what these things actually mean and have an understanding of it.


The more I read the more confused I get, if someone could explain it so a child could understand it I would appreciate it.

https://redd.it/1h2vykk
@r_bash
Can you change the escape key in vi mode?

I want to use ctrl+c like I use in my editor to enter normal mode

https://redd.it/1h33g39
@r_bash
Escape $ to write literal placeholders

Hi,

Newbie here, apologies in advance if my question is not appropriate.

I have a bash noscript that installs some software, and I would like to generate a networkd-dispatcher noscript.

The networkd-dispatcher noscript should contain placeholders such as "$IFACE" and "$UNIT_NAME", but the installation noscript interprets them as undeclared variables, and the networkd-dispatcher noscripts ends up with empty spaces.

How can I escape these "$"?

This is what I have at the moment in the installation noscript:

createnetworkdnoscript() {
cat << EOF > $HOME/BirdNET-Pi/templates/50-birdweather-publication
#!/bin/bash
UNITNAME="birdweatherpublication@$IFACE.service"
# Check if the service is active and then start it
if systemctl is-active --quiet "$UNITNAME"; then
echo "
$UNITNAME is already running."
else
echo "Starting $UNITNAME..."
systemctl start "
$UNITNAME"
fi
EOF
chmod +x $HOME/BirdNET-Pi/templates/50-birdweather-publication
chown root:root $HOME/BirdNET-Pi/templates/50-birdweather-publication
ln -sf $HOME/BirdNET-Pi/templates/50-birdweather-publication /etc/networkd-dispatcher/routable.d
systemctl enable systemd-networkd
}

createnetworkdnoscript

https://redd.it/1h47zez
@r_bash
Advent of Code 2024 - Day 1 Problem 1 Solution in Bash

Hi, I have been learning Bash the last two days as my first noscripting language. I saw the advent of code started this year, and I thought why not try to solve it with Bash (since it's the only language I know so far." I managed to solve most of it by myself, had only to look for the sort command.

---

# Bash solution for day 1 problem 1

## Summary of the problem

- 2 Teams are searching for the locations where the Chief Historian might be.
- Each location has a 'location ID'.
- 2 Groups trying to make a complete list of 'location ID'.
- The two lists are not similar.
- Pair the smallest 'location ID' from the left with the smallest 'location ID' from the right
- Measure the distance (difference) between each 'location ID' pair.
- Measure the total aggregate distance between all 'location ID' pairs.

# inputs

A text file with the 2 lists is presented in the following format

18944   47230
94847 63037
93893 35622


## Steps to solution

1. Separate the numbers in the text file into two lists.
2. Order the numbers in each list from the smallest to the biggest.
3. Measure the distance between each 2 respective numbers.
4. Measure the total of distances.

## Solution

Save the numbers in a text file called input.txt"

#!/bin/bash

# Generate an array from the input
list=(`cat input.txt`)

# Save the even elements into list.left.txt and the odd elements into list.right.txt
for el in "${!list[@]}"
do
rem=$((${el} % 2))
if [[ rem -eq 0 ]]
then
echo "${list[$el]}" >> list.left.txt
else
echo "${list[$el]}" >> list.right.txt
fi
done

# Sorting the numbers
sort list.left.txt > list.left.sorted.txt
sort list.right.txt > list.right.sorted.txt

# create arrays from the two files
left=(`cat list.left.sorted.txt`)
right=(`cat list.right.sorted.txt`)

# calculate the difference and save it to a text file.
for ele in "${!left[@]}"
do
diff=$(("${left[$ele]}"-"${right[$ele]}"))
if [ $diff -ge 0 ]
then
echo "$diff" >> diffs.txt
else
diff=$(($diff * -1))
echo "$diff" >> diffs.txt
fi
done

# Import the differences as an array
di=(`cat diffs.txt`)

total=0

for elem in ${di[@]}
do
total=$(($total + $elem))
done
echo "$total"


https://redd.it/1h4t92n
@r_bash
Why this loop doesn't break the first time?

while read -r line
do
echo "$line"
done <file.txt


Here, the condition read -r line has nothing to read the first time the loop runs, why it doesn't break the first time?

https://redd.it/1h526bx
@r_bash
Move files from all subfolders to root folder but new filename should contain the folders

Hello,


i have a lot of folders containing files and more sobfolders with files. I want to have all that files in the root folder and the filename should contain the folder name. For example the file /testdir1/testdir2/testfile,txt should be in /testdir1_-_testdir2_-_testfile.txt

The thing is, some years ago i had done this by accident (i think i tried just to remove bad characters from filename but by accident also replaces the / but i can't get it together again :-( )



https://redd.it/1h5mrsi
@r_bash
Any way to hook into 'command not found' and run a noscript / function?

Curious if there's any way to hook into the error condition 'command not found' and run a noscript/function? Basically, I'd like to do something similar to "thefuck" but have it run automatically.

$ doesnotexist
-bash: doesnotexist: command not found

# how to (automatically) call some custom function/noscript/etc?
# preferably with access to bash history so I can run a
# fuzzy find with target command vs my defined aliases

So far my searches keep coming up with irrelevant stuff so I'm not sure if I'm just using bad search terms or if this is something that is just not possible under bash.

https://redd.it/1h65lkg
@r_bash